求一个C语言编矩阵乘法运算的程序

Python015

求一个C语言编矩阵乘法运算的程序,第1张

#include "iostream.h"

void MatrixChain(int *p,int n,int **m,int **s)

{

for(int i=1i<=ni++)

m[i][i]=0

for(int r=2r<=nr++)

for( i=1i<=n-r+1i++)

{

int j=i+r-1

m[i][j]=m[i+1][j]+p[i-1]*p[i]*p[j]

s[i][j]=i

for(int k=i+1k<jk++)

{

int t=m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j]

if(t<m[i][j])

{

m[i][j]=t

s[i][j]=k

}

}

}

}

void Traceback(int i,int j,int **s)

{

if(i==j)return

Traceback(i,s[i][j],s)

Traceback(s[i][j]+1,j,s)

cout<<"让 A"<<i//<<","<<s[i][j]

cout<<"和 A"<<(s[i][j]+1)<<"相乘"<<endl//<<","<<j<<"相乘"<<endl

}

void main()

{

int n,*p

int j=1

cout<<"请输入矩阵的个数"<<endl

cin>>n

p=new int[n+1]

cout<<"请输入第一个矩阵的行数,然后按回车键"<<endl

cin>>p[0]

cout<<"第"<<j<<"个矩阵是"<<endl

cout<<p[0]<<"*"

cin>>p[1]

// cout<<p[1]<<endl

cout<<endl

for(int i=2i<n+1i++)

{

cout<<"第"<<i<<"个矩阵是:"

cout<<p[i-1]<<"*"

cin>>p[i]

}

// int p[]={30,35,15,5,10,20,25}

// int m[6][6],s[6][6]

int **m,**s

m=new int*[n]

for( i=1i<=ni++)

m[i]=new int[n]

s=new int*[n]

for( i=1i<=ni++)

s[i]=new int[n]

MatrixChain(p,n,m,s)

Traceback(1,n,s)

}

这是矩阵连乘

这里我们用两种方式做一比较:

假设原来相乘的3个矩阵为如下方式(为了区别,特选择大写和小写两种表示方式):

A*B B*C C*D

前两个先乘:

A*B B*C

a*b*c次乘法

a*(b-1)*c次加法

结果为A*C,然后再与C*D相乘:

A*C C*D

a*c*d次乘法

a*(c-1)*d次加法

共a*b*c+a*c*d=a*c*(b+d)次乘法

共a*(b-1)*c+a*(c-1)*d=a*c*(b+d)-a*(c+d)次加法

实际上:乘法的执行时间远远大于加法的执行时间,故略去加法时间不计。

如果换一种方式:

A*B B*C C*D

先后两者相乘:

B*C C*D = B*D

乘法:b*c*d

再与前者相乘:

A*B B*D

乘法:a*b*d

共(a+c)*b*d次乘法

这里只需要比较

a*c*(b+d)和(a+c)*b*d谁大谁小的问题

当 a*c*(b+d)>(a+c)*b*d 时说明前者更浪费机时,反之便是后者更浪费机时。

因此3个矩阵相乘时的选择策略函数就是比较他们的阶数关系。

对于A1=35*40 A2=40*20 A3=20*10

因为

a = 35, b = 40, c = 20, d = 10

a*c*(b+d) = 35*20*(40+10) = 35000

(a+c)*b*d = (35+20)*40*10 = 22000

前者大于后者,说明选择先将前两个相乘不如选择先将后两个相乘节省机时。

#include "iostream.h"

void MatrixChain(int *p,int n,int **m,int **s)

{

for(int i=1i<=ni++)

m[i][i]=0

for(int r=2r<=nr++)

for( i=1i<=n-r+1i++)

{

int j=i+r-1

m[i][j]=m[i+1][j]+p[i-1]*p[i]*p[j]

s[i][j]=i

for(int k=i+1k<jk++)

{

int t=m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j]

if(t<m[i][j])

{

m[i][j]=t

s[i][j]=k

}

}

}

}

void Traceback(int i,int j,int **s)

{

if(i==j)return

Traceback(i,s[i][j],s)

Traceback(s[i][j]+1,j,s)

cout<<"让 A"<<i//<<","<<s[i][j]

cout<<"和 A"<<(s[i][j]+1)<<"相乘"<<endl//<<","<<j<<"相乘"<<endl

}

void main()

{

int n,*p

int j=1

cout<<"请输入矩阵的个数"<<endl

cin>>n

p=new int[n+1]

cout<<"请输入第一个矩阵的行数,然后按回车键"<<endl

cin>>p[0]

cout<<"第"<<j<<"个矩阵是"<<endl

cout<<p[0]<<"*"

cin>>p[1]

// cout<<p[1]<<endl

cout<<endl

for(int i=2i<n+1i++)

{

cout<<"第"<<i<<"个矩阵是:"

cout<<p[i-1]<<"*"

cin>>p[i]

}

// int p[]={30,35,15,5,10,20,25}

// int m[6][6],s[6][6]

int **m,**s

m=new int*[n]

for( i=1i<=ni++)

m[i]=new int[n]

s=new int*[n]

for( i=1i<=ni++)

s[i]=new int[n]

MatrixChain(p,n,m,s)

Traceback(1,n,s)

}

这是矩阵连乘