看了大神的博客:点击打开链接
矩阵相乘这里介绍2种方法,
首先明白一点:2个矩阵相乘对于a矩阵 na*ma b矩阵 nb*mb (代表n行m列)
只有 ma==nb时,才能进行运算,不然就不能运算 运算出来的矩阵c na*mb
具体怎么运算举例说明
a 2*3 b 3*2 c 2*2
1 2 3 9 8 1*9+2*7+3*14,1*8+2*11+3*20
4 5 6 7 11 4*9+5*7+6*14, 4*8+5*11+6*20
14 20
会发现什么规律呢?就是a矩阵的每一行的数与b矩阵的每一列的数对应相乘求和
求和几次是结束呢?那肯定是a,b矩阵相等的部分,下面看代码
<span style="font-size:18px;"><span style="font-size:18px;">int i,j,k,temp;
for(i=0;i<na;++i)
{
for(j=0;j<mb;++j)//c矩阵的列数
{
temp=0;
for(k=0;k<ma;++k)
temp+=a[i][k]+b[k][j];
c[i][j]=temp;
printf("%d",temp);
if(j==mb-1)
printf("\n");
else
printf(" ");
}
} </span></span>
a 2*3 b 3*2 c 2*2
1 2 3 9 8 1*9+2*7+3*14,1*8+2*11+3*20
4 5 6 7 11 4*9+5*7+6*14, 4*8+5*11+6*20
14 20
下面的代码计算顺序
举例说明一下
temp[mb] temp[0]+=1*9 , temp[1]+=1*8
temp[0]+=2*7, temp[1]+=2*11
temp[0]+=3*14, temp[1]+=3*20
<span style="font-size:18px;"><span style="font-size:18px;">int i,j,temp[mb],k,g;
for(i=0;i<na;++i)//a行
{
for(k=0;k<mb;++i)//b列
temp[k]=0;
for(j=0;j<ma;++j)//a列
{
for(g=0;g<mb;++g) //b列
temp[g]+=a[i][j]*b[j][g];
}
for(k=0;k<mb-1;++k)
{
printf("%d ",temp[k]);
}
printf("%d\n",temp[mb-1]);
} </span></span>