c语言 高效 矩阵乘法,急求c语言做多个矩阵乘法最优次序的计算过程,并找到对应的连乘次序...

急求c语言做多个矩阵乘法最优次序的计算过程,并找到对应的连乘次序

答案:2  信息版本:手机版

解决时间 2019-10-04 18:09

已解决

2019-10-03 21:17

急求c语言做多个矩阵乘法最优次序的计算过程,并找到对应的连乘次序

最佳答案

2019-10-03 21:54

好几位问此问题了。自己把下面的函数改一下就可以了。 矩阵乘法,只有前矩阵列数等与后矩阵行数的两矩阵才能相乘.结果矩阵大小等于前行后列。 C 语言行列

全部回答

1楼

2019-10-03 23:10

1,若程序定义为三行三列的矩阵,并在主函数中键盘赋值。请编写函数juzhen(int a[][3],int n),函数功能是:使矩阵左下角元素中的值乘以.例如:若矩阵中的值为:

1 9 7

2 3 8

4 5 6

n=3,则矩阵值变为:

1 9 7

6 9 8

12 15 18

注:二维数组下三角元素每行最后元素的列标和该列的列号一致

#include

int juzhen(int a[][3],int n)

{

int i,j;

for (i=1;i<3;i++)

for (j=0;j<=i;j++)

a[i][j]=a[i][j]*n;

}

main()

{

int i,j,a[3][3],m;

clrscr();

printf("please enter 9 numbers :\n");

for (i=0;i<3;i++)

for (j=0;j<3;j++)

scanf("%d",&a[i][j]);

printf("the old ju zhen is:\n");

for (i=0;i<3;i++)

{

for (j=0;j<3;j++)

printf("%3d",a[i][j]);

printf("\n");

}

printf("please enter a int number:\n");

scanf("%d",&m);

juzhen (a,m);

printf("the new ju zhen is:\n");

for (i=0;i<3;i++)

{

for (j=0;j<3;j++)

printf("%3d",a[i][j]);

printf("\n");

}

}

2,请编写函数juzhen,该函数的功能是:将三行四列矩阵x乘以四行三列矩阵y,结果放在三行三列矩阵中。矩阵相乘的基本方法是:矩阵xy中行列下标分别为i,j的元素的值,是矩阵x中第i行上四个元素与矩阵y中第j列上四个元素对应相乘的积。

x和y矩阵原型可运行后看到!

#include

#include

void juzhen (int a[3][4],int b[4][3],int ab[3][3])

{

int i,j,z;

for (i=0;i<3;i++)

for (j=0;j<4;j++)

for (z=0;z<3;z++)

ab[i][z]=ab[i][z]+a[i][j]*b[j][z];

}

main()

{

int x[3][4]={1,0,1,1,2,1,0,1,1,2,0,3};

int y[4][3]={1,1,1,0,0,0,2,1,1,1,1,3};

int xy[3][3]={0},i,j;

clrscr();

juzhen (x,y,xy);

printf("x ju zhen is:\n");

for (i=0;i<3;i++)

{

for (j=0;j<4;j++)

printf("%3d",x[i][j]);

printf("\n");

}

printf("y ju zhen is:\n");

for (i=0;i<4;i++)

{

for (j=0;j<3;j++)

printf("%3d",y[i][j]);

printf("\n");

}

printf("xy ju zhen is:\n");

for (i=0;i<3;i++)

{

for (j=0;j<3;j++)

printf("%3d",xy[i][j]);

printf("\n");

}

}

由于你没有说要求,我就写了两个,这是两道比较精典的求c语言矩阵乘法程序

我要举报

如果感觉以上信息为低俗/不良/侵权的信息,可以点下面链接进行举报,我们会做出相应处理,感谢你的支持!

大家都在看

推荐资讯

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现矩阵连乘的最计算次序,可以使用动态规划的方法。 首先,我们需要定义一个二维数组m和一个二维数组s来存储最计算次序和最计算代价。其中,m[i][j]表示矩阵Ai到Aj的最计算次序,s[i][j]表示矩阵Ai到Aj的最小计算代价。 接下来,我们可以使用以下的动态规划算法来计算m和s数组: 1. 初始化m和s数组的对角线,即当i=j时,m[i][j]=0,s[i][j]=0。 2. 对于每个长度为l的子问题,从左到右依次计算s[i][i+l]和m[i][i+l],其中i表示子问题的起始下标,l表示子问题的长度,即i+l<=n。 3. 在计算s[i][i+l]时,我们需要枚举Ai到Ak和Ak+1到Aj的所有可能划分,计算每个划分的代价,并选择最小的代价作为s[i][i+l]的值。具体地,我们可以使用以下的公式来计算s[i][i+l]: s[i][i+l] = min{s[i][k] + s[k+1][i+l] + p[i-1]*p[k]*p[i+l]},其中i<=k<i+l,p[i-1]表示矩阵Ai-1的行数,p[k]表示矩阵Ak的列数,p[i+l]表示矩阵Ai+l的列数。 4. 在计算m[i][i+l]时,我们可以利用上一步计算得到的s数组来确定最计算次序。具体地,我们可以使用以下的公式来计算m[i][i+l]: m[i][i+l] = k,其中i<=k<i+l,且s[i][i+l] = s[i][k] + s[k+1][i+l] + p[i-1]*p[k]*p[i+l]。 5. 最终,我们可以输出m[1][n]来得到矩阵连乘的最计算次序。 下面是使用C语言实现上述算法的示例代码: ```c #include <stdio.h> #include <stdlib.h> #define MAXN 5 // 矩阵的个数 int p[MAXN+1]; // 存储矩阵的行列数 int m[MAXN+1][MAXN+1]; // 存储最计算次序 int s[MAXN+1][MAXN+1]; // 存储最小计算代价 void matrix_chain_order(int n) { int i, j, k, l, q; // 初始化对角线 for (i = 1; i <= n; i++) { m[i][i] = 0; s[i][i] = 0; } // 计算子问题的最小计算代价和最计算次序 for (l = 2; l <= n; l++) { for (i = 1; i <= n-l+1; i++) { j = i + l - 1; s[i][j] = 0x7fffffff; // 初始化为最大值 for (k = i; k <= j-1; k++) { q = s[i][k] + s[k+1][j] + p[i-1]*p[k]*p[j]; if (q < s[i][j]) { s[i][j] = q; m[i][j] = k; } } } } } void print_optimal_parens(int i, int j) { if (i == j) { printf("A%d", i); } else { printf("("); print_optimal_parens(i, m[i][j]); print_optimal_parens(m[i][j]+1, j); printf(")"); } } int main() { int i, n; // 读入矩阵的行列数 printf("请输入%d个矩阵的行列数:\n", MAXN); for (i = 0; i <= MAXN; i++) { scanf("%d", &p[i]); } // 计算计算次序 n = MAXN; matrix_chain_order(n); // 输出最计算次序 printf("矩阵连乘的最计算次序为:"); print_optimal_parens(1, n); printf("\n"); return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值