n个矩阵相乘
有一系列矩阵按顺序排列
每个矩阵的行数=前一个矩阵的列数
n个矩阵相乘也称为矩阵链乘法
问题:如何确定相乘的顺序(给矩阵加括号),提高计算效率 ?
#include<iostream>
#define M 10000
using namespace std;
int Matrix_Chain_Multiply(int p[],int n,int D[][10],int Rec[][10])
{
int l,i,j,k,q;
for(l=2;l<=n;l++) //子链的长度
{
for(i=1;i<=n-l+1;i++) //依次计算
{
j=i+l-1;
for(k=i;k<=j-1;k++) //切割的位置
{
q=D[i][k]+D[k+1][j]+p[i-1]*p[k]*p[j];
if(q<D[i][j])
{
D[i][j]=q;
Rec[i][j]=k;
}
}
}
}
return D[1][n];
}
void print_Matrix_Chain(string U[],int Rec[][10],int i,int j)
{
if(i==j)
{
cout<<U[i];
return;
}
cout<<"(";
print_Matrix_Chain(U,Rec,i,Rec[i][j]);
cout<<")(";
print_Matrix_Chain(U,Rec,Rec[i][j]+1,j);
cout<<")";
return;
}
int main()
{
int n=6;
int p[7]={2,3,7,9,5,2,4};
string U[7]={"U0","U1","U2","U3","U4","U5","U6"};
int D[10][10],Rec[10][10];
for(int i=0;i<=n;i++)
{
for(int j=0;j<=n;j++)
{
if(i==j)
D[i][j]=0;
else
D[i][j]=M;
}
}
cout<<"最少计算次数为:"<<Matrix_Chain_Multiply(p,n,D,Rec)<<endl;
cout<<"分割方案为:";
print_Matrix_Chain(U,Rec,1,n);
}
运行结果·:
最少计算次数为:286
分割方案为:((U1)((U2)((U3)((U4)(U5)))))(U6)