| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1196 人关注过本帖
标题:[经验]一个矩阵乘法的实现
只看楼主 加入收藏
lg_mic
Rank: 1
等 级:新手上路
帖 子:55
专家分:0
注 册:2007-9-18
收藏
 问题点数:0 回复次数:1 
[经验]一个矩阵乘法的实现
书上的习题,原题是“已知两个矩阵a[3][4]和b[4][3],编程求矩阵c=a*b,并分别输出矩阵a,b,和c。”
首先自然是分析,矩阵c的每一个值应该分别为
c[0][0]=a[0][0]*b[0][0]+a[0][1]*b[1][0]+……+a[0][3]*b[3][0]
c[0][1]=a[0][0]*b[0][1]+a[0][1]*b[1][1]+……+a[0][3]*b[3][1]
……
c[2][2]=a[2][0]*b[0][2]+a[2][1]*b[1][2]+……+a[2][3]*b[3][2]
看来要声明3个变量i,j,k,然后用3重for循环了。写代码测试一下
/*习题6.01两矩阵相乘,并分别输出矩阵a、b、c*/
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
int a[3][4],b[4][3],c[3][3],i,j,k;
for(i=0;i<3;i++)
for(j=0;j<4;j++)
{
printf("a[%d][%d]=",i,j);
scanf("%d",&a[i][j]);
}
for(j=0;j<4;j++)
for(i=0;i<3;i++)
{
printf("b[%d][%d]=",j,i);
scanf("%d",&b[j][i]);
}
for(k=0;k<3;k++)
for(i=0;i<3;i++)
for(j=0;j<4;j++)
c[k][i]+=a[k][j]*b[j][i];

printf("a:\n");
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
printf("a[%d][%d]=%d\t",i,j,a[i][j]);
printf("\n");
}
printf("b:\n");
for(i=0;i<4;i++)
{
for(j=0;j<3;j++)
printf("b[%d][%d]=%d\t",i,j,b[i][j]);
printf("\n");
}
printf("c:\n");
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
printf("c[%d][%d]=%d\t",i,j,c[i][j]);
printf("\n");
}
system("pause");
return 0;
}

红字的地方就是求c[3][3]中值的代码,输入数据测试一下,使a[3][4]全为1,b[4][3]第一列为1,第二列为2,第三列为3。运行:
结果c[3][3]的值十分诡异,根本就不是预期的值。(有兴趣的人可以试一下)
为什么呢?重检查一遍代码,原来在声明c[3][3]的时候忘记了要初始化了。

将 int a[3][4],b[4][3],c[3][3],i,j,k;修改为
static int c[3][3]={0};
int a[3][4],b[4][3],i,j,k;

编译运行,输出:
c[0][0]=4 c[0][1]=8 c[0][2]=12
……
c[2][0]=4 c[2][1]=8 c[2][2]=12

测试通过!!可喜可贺,可喜可贺。


以上是我用我目前所知的知识编写一个矩阵乘法的过程,发出来与大家分享。另外,谁有更好的解决办法望不吝赐教
搜索更多相关主题的帖子: 矩阵 乘法 经验 习题 变量 
2007-09-23 21:14
百年不亮
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:789
专家分:0
注 册:2006-4-14
收藏
得分:0 
有本书叫《C数值算法》,像字典一样厚,计算等应用数学专业或要学数值计算可以看这本书。
2007-09-23 21:48
快速回复:[经验]一个矩阵乘法的实现
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.040193 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved