c语言实现矩阵连乘问题
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
次序反复调用 2 个矩阵相乘的标准算法计算出矩阵连乘积。如何确定计算矩阵连乘积的计算 次序,使得依此次序计算矩阵连乘积需要的数乘次数最少? 代码:#include<stdio.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;k<j;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(t<m[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++) {
矩阵连乘
问题描述:
给定 n 个矩阵{A1, A2,, An} ,其中 Ai 与 Ai1 是可乘的, i 1, 2,, n 1 。考察这 n 个矩阵的连乘积 A1A2 An 。由于矩阵乘法满足结合律,所以计算矩阵的连乘可以有许多
不同的计算次序。这种计算次序可以用加括号的方式来确定。 若一个矩阵连乘积的计算次序完全确定,也就是说该连乘积已完全加括号,则可以依此
Hale Waihona Puke Baidu
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; } 输出结果:
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;k<j;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(t<m[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++) {
矩阵连乘
问题描述:
给定 n 个矩阵{A1, A2,, An} ,其中 Ai 与 Ai1 是可乘的, i 1, 2,, n 1 。考察这 n 个矩阵的连乘积 A1A2 An 。由于矩阵乘法满足结合律,所以计算矩阵的连乘可以有许多
不同的计算次序。这种计算次序可以用加括号的方式来确定。 若一个矩阵连乘积的计算次序完全确定,也就是说该连乘积已完全加括号,则可以依此
Hale Waihona Puke Baidu
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; } 输出结果: