矩陣相乘的算法
問題:求矩陣相乘后的和。
一、最基本的算法
下面給出一個例子來說明一下矩陣是如何相乘的。
矩陣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. 閱讀(1807) 評論(0) 收藏 舉報
浙公網安備 33010602011771號