矩阵相乘的算法
问题:求矩阵相乘后的和。
一、最基本的算法
下面给出一个例子来说明一下矩阵是如何相乘的。
矩阵A为 1 0 2
3 5 6
矩阵B为 3 1
2 2
1 3
C=A*B = 1*3+0*2+2*1 1*1+0*2+2*3
3*3+5*2+6*1 3*1+5*2+6*3
最简单的算法就是用3个for循环就可以搞定了。
假设A有ArowNum行, AvolBrow列。
B必有AvolBrow行,假设B有BvolNum列。
则循环如下:
for(int i=0; i<ArowNum; i++)
for(int j=0; j<BvolNum; j++)
for(int k=0; k<AvolBrow; k++)
C[i][j] += A[i][k]*B[k][j];
这个是矩阵相乘的例子。
for(int i=0; i<ArowNum; i++)
for(int j=0; j<BvolNum; j++)
for(int k=0; k<AvolBrow; k++)
sum += A[i][k]*B[k][j];
这个是矩阵相乘后求和的例子。
二、发现规律,提高效率
还是上面的那个例子。
矩阵A为 1 0 2
3 5 6
矩阵B为 3 1
2 2
1 3
C=A*B = 1*3+0*2+2*1 1*1+0*2+2*3
3*3+5*2+6*1 3*1+5*2+6*3
我们来观察一下C中的每个式子中A元素的列坐标和B元素的行坐标。
1(v:0)*3(r:0)+0(v:1)*2(r:1)+2(v:2)*1(r:2)——1式
1(v:0)*1(r:0)+0(v:1)*2(r:1)+2(v:2)*3(r:2)——2式
3(v:0)*3(r:0)+5(v:1)*2(r:1)+6(v:2)*1(r:2)——3式
3(v:0)*1(r:0)+5(v:1)*2(r:1)+6(v:2)*3(r:2)——4式
1式与2式结合:1(v:0)*(3+1)+0(v:1)*(2+2)+2(v:2)*(1+3)——5式
3式与4式结合:3(v:0)*(3+1)+5(v:1)*(2+2)+6(v:2)*(1+3)——6式
5式与6式结合:(1+3)*(3+1)+(0+5)*(2+2)+(2+6)*(1+3)——7式
从7式可以看出:1+3 0+5 2+6是将A中的元素以列相加
3+1 2+2 1+3是将B中的元素以行相加
具体的代码已经很明显了,就不在写出了。
很明显这个是两重循环,所以效率大大提高了。
posted on 2011-11-27 11:21 More study needed. 阅读(1749) 评论(0) 编辑 收藏 举报