c语言实现矩阵连乘问题.docxVIP

  • 54
  • 0
  • 约1.53千字
  • 约 3页
  • 2017-06-07 发布于重庆
  • 举报
c语言实现矩阵连乘问题

矩阵连乘 问题描述: 给定n个矩阵 ,其中与是可乘的,。考察这n个矩阵的连乘积 。由于矩阵乘法满足结合律,所以计算矩阵的连乘可以有许多不同的计算次序。这种计算次序可以用加括号的方式来确定。 若一个矩阵连乘积的计算次序完全确定,也就是说该连乘积已完全加括号,则可以依此次序反复调用2个矩阵相乘的标准算法计算出矩阵连乘积。如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少? 代码:#includestdio.h const int MAX=100;//静态变量,控制矩阵大小 int n;//定义相乘矩阵 的个数 int p[MAX+1],m[MAX][MAX],s[MAX][MAX]; void matrixChain() { for(int i=1;i=n;i++) //填主对角线d1 { m[i][i]=0; } for(int r=2;r=n;r++)//填次对角线dr(r=2~n) { for(int i=1;i=n-r+1;i++)//填次对角线的各个元素 { int j=i+r-1;//计算次对角线dr上第i行的元素的列标 m[i][j]=m[i+1][j]+ p[i-1]*p[i]*p[j];//用计算Ai(Ai+1…Aj)的次数作为m[i][j]的初始值 s[i][j]=i;//保存分界点 for(int k=i+1;kj;k++) {//用m[i][k]和m[k+1][j]计算m[i][j]的新值 int t=m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j]; if(tm[i][j]) { m[i][j]=t; s[i][j]=k; } } } } } void tb(int i,int j,int s[MAX][MAX]) {//根据s[][]记录的各个子段的最优解,将其输出 if(i==j) return; tb(i,s[i][j],s); tb(s[i][j]+1,j,s); printf(Multiply A%d,%dand A%d,%d\n,i,s[i][j],s[i][j]+1,j); } int main() { printf(Please input the number of n...\n); scanf(%d,n); for(int i=0;i=n;i++) scanf(%d,p[i]); matrixChain();//调用函数 tb(1,n,s); printf(%d\n,m[1][n]);//输出最优解 printf(\n\n\n); for(int i=1;i=n;i++)//输出矩阵的m[][]的值 { for(int j=1;j=n;j++) { printf(%d\t,m[i][j]); } printf(\n); } printf(\n\n\n); for(int i=1;i=n;i++)//输出矩阵的s[][]的值 { for(int j=1;j=n;j++) { printf(%d\t,s[i][j]); } printf(\n); } return 0; } 输出结果:

文档评论(0)

1亿VIP精品文档

相关文档