某工程计算中经常要完成多个矩阵相乘(链乘)的计算任务,对矩阵相乘进行以下说明。
(1)两个矩阵相乘要求第一个矩阵的列数等于第二个矩阵的行数,计算量主要由进行乘法运算的次数决定,假设采用标准的矩阵相乘算法,计算Amxn*Bnxp需要m*n*p次行乘法运算的次数决定、乘法运算,即时间复杂度为O(m*n*p)。
(2)矩阵相乘满足结合律,多个矩阵相乘时不同的计算顺序会产生不同的计算量。以矩阵A15×100,A2100*8,A38x50三个矩阵相乘为例,若按(A1*A2)*A3计算,则需要进行5*100*8+5*8*50=6000次乘法运算,若按A1*(A2*A3)计算,则需要进行100*8*50+5*100*50=65000次乘法运算。
矩阵链乘问题可描述为:给定n个矩阵,对较大的n,可能的计算顺序数量非常庞大,用蛮力法确定计算顺序是不实际的。经过对问题进行分析,发现矩阵链乘问题具有最优子结构,即若A1*A2**An的一个最优计算顺序从第k个矩阵处断开,即分为A1*A2*…*Ak和Ak+1*Ak+2*...*An两个子问题,则该最优解应该包含 A1*A2*…*Ak的一个最优计算顺序和 Ak+1*Ak+2*...*An 的一个最优计算顺序。据此构造递归式:
(2)函数cmm
#define N100
int cost[N[N];
int trace[N][N];
int cmm(int n,int seq[]){
int tempCost;
int tempTrace;
int i,j,k,p;
int temp;
for( i=0;i<n;i++){ cost[i][i] = 0;}
for(p=1;p<n;p++){
for(i=0; i<n-p;i++){
(1) ;
tempCost = -1;
for(k = i; (2) ;k++){
temp= (3) ;
if(tempCost==-1 || tempCost>temp){
tempCost = temp;
tempTrace=k;
}
}
cost[i][j] = tempCost;
(4) ;
}
}
return cost[0][n-1];
}