[经验]一个矩阵乘法的实现
书上的习题,原题是“已知两个矩阵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;
}
#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
测试通过!!可喜可贺,可喜可贺。
以上是我用我目前所知的知识编写一个矩阵乘法的过程,发出来与大家分享。另外,谁有更好的解决办法望不吝赐教