Strassen矩陣乘法

2021-04-18 01:18:45 字數 2754 閱讀 2372

矩陣乘法是線性代數中最常見的運算之一,它在數值計算中有廣泛的應用。若a和b是2個n×n的矩陣,則它們的乘積c=ab同樣是乙個n×n的矩陣。a和b的乘積矩陣c中的元素c[i,j]定義為: 

若依此定義來計算a和b的乘積矩陣c,則每計算c的乙個元素c[i,j],需要做n個乘法和n-1次加法。因此,求出矩陣c的n2個元素所需的計算時間為0(n3)。

60年代末,strassen採用了類似於在大整數乘法中用過的分治技術,將計算2個n階矩陣乘積所需的計算時間改進到o(nlog7)=o(n2.18)。

首先,我們還是需要假設n是2的冪。將矩陣a,b和c中每一矩陣都分塊成為4個大小相等的子矩陣,每個子矩陣都是n/2×n/2的方陣。由此可將方程c=ab重寫為:

(1)

由此可得: 

c11=a11b11+a12b21 (2)

c12=a11b12+a12b22 (3)

c21=a21b11+a22b21 (4)

c22=a21b12+a22b22 (5)

如果n=2,則2個2階方陣的乘積可以直接用(2)-(3)式計算出來,共需8次乘法和4次加法。當子矩陣的階大於2時,為求2個子矩陣的積,可以繼續將子矩陣分塊,直到子矩陣的階降為2。這樣,就產生了乙個分治降階的遞迴演算法。依此演算法,計算2個n階方陣的乘積轉化為計算8個n/2階方陣的乘積和4個n/2階方陣的加法。2個n/2×n/2矩陣的加法顯然可以在c*n2/4時間內完成,這裡c是乙個常數。因此,上述分治法的計算時間耗費t(n)應該滿足:

這個遞迴方程的解仍然是t(n)=o(n3)。因此,該方法並不比用原始定義直接計算更有效。究其原因,乃是由於式(2)-(5)並沒有減少矩陣的乘法次數。而矩陣乘法耗費的時間要比矩陣加減法耗費的時間多得多。要想改進矩陣乘法的計算時間複雜性,必須減少子矩陣乘法運算的次數。按照上述分治法的思想可以看出,要想減少乘法運算次數,關鍵在於計算2個2階方陣的乘積時,能否用少於8次的乘法運算。strassen提出了一種新的演算法來計算2個2階方陣的乘積。他的演算法只用了7次乘法運算,但增加了加、減法的運算次數。這7次乘法是: 

m1=a11(b12-b22)

m2=(a11+a12)b22

m3=(a21+a22)b11

m4=a22(b21-b11)

m5=(a11+a22)(b11+b22)

m6=(a12-a22)(b21+b22)

m7=(a11-a21)(b11+b12)

做了這7次乘法後,再做若干次加、減法就可以得到: 

c11=m5+m4-m2+m6

c12=m1+m2

c21=m3+m4

c22=m5+m1-m3-m7

以上計算的正確性很容易驗證。例如: 

c22=m5+m1-m3-m7

=(a11+a22)(b11+b22)+a11(b12-b22)-(a21+a22)b11-(a11-a21)(b11+b12)

=a11b11+a11b22+a22b11+a22b22+a11b12

-a11b22-a21b11-a22b11-a11b11-a11b12+a21b11+a21b12

=a21b12+a22b22 

由(2)式便知其正確性。

至此,我們可以得到完整的strassen演算法如下:

procedure strassen(n,a,b,c);

begin

if n=2 then matrix-multiply(a,b,c)

else begin

將矩陣a和b依(1)式分塊;

strassen(n/2,a11,b12-b22,m1);

strassen(n/2,a11+a12,b22,m2);

strassen(n/2,a21+a22,b11,m3);

strassen(n/2,a22,b21-b11,m4);

strassen(n/2,a11+a22,b11+b22,m5);

strassen(n/2,a12-a22,b21+b22,m6);

strassen(n/2,a11-a21,b11+b12,m7);

; end;

end;

其中matrix-multiply(a,b,c)是按通常的矩陣乘法計算c=ab的子演算法。

strassen矩陣乘積分治演算法中,用了7次對於n/2階矩陣乘積的遞迴呼叫和18次n/2階矩陣的加減運算。由此可知,該演算法的所需的計算時間t(n)滿足如下的遞迴方程:

按照解遞迴方程的套用公式法,其解為t(n)=o(nlog7)≈o(n2.81)。由此可見,strassen矩陣乘法的計算時間複雜性比普通矩陣乘法有階的改進。

有人曾列舉了計算2個2階矩陣乘法的36種不同方法。但所有的方法都要做7次乘法。除非能找到一種計算2階方陣乘積的演算法,使乘法的計算次數少於7次,按上述思路才有可能進一步改進矩陣乘積的計算時間的上界。但是hopcroft和kerr(197l)已經證明,計算2個2×2矩陣的乘積,7次乘法是必要的。因此,要想進一步改進矩陣乘法的時間複雜性,就不能再寄希望於計算2×2矩陣的乘法次數的減少。或許應當研究3×3或5×5矩陣的更好演算法。在strassen之後又有許多演算法改進了矩陣乘法的計算時間複雜性。目前最好的計算時間上界是o(n2.367)。而目前所知道的矩陣乘法的最好下界仍是它的平凡下界ω(n2)。因此到目前為止還無法確切知道矩陣乘法的時間複雜性。關於這一研究課題還有許多任務作可做。

本文**

strassen矩陣乘法 Strassen矩陣乘法

求矩陣a,b相乘的結果c 直接根據矩陣乘法的定義來遍歷計算。c 語言 void matrixmul int a,int b,int c,int m,int b,int n void test3 int b 3 2 int c 2 2 matrixmul int a,int b,int c,2,3,2...

Strassen矩陣乘法

strassen矩陣乘法 strassen矩陣乘法是通過遞迴實現的,它將一般情況下二階矩陣乘法 可擴充套件到 階,但strassen矩陣乘法要求 是 的冪 所需的8次乘法降低為7次,將計算時間從o ne3 降低為o ne2.81 矩陣c ab,可寫為 c11 a11b11 a12b21 c12 a1...

strassen矩陣乘法

出處 矩陣乘法是線性代數中最常見的運算之一,它在數值計算中有廣泛的應用。若a和b是2個n n的矩陣,則它們的乘積c ab同樣是乙個n n的矩陣。a和b的乘積矩陣c中的元素c i,j 定義為 若依此定義來計算a和b的乘積矩陣c,則每計算c的乙個元素c i,j 需要做n個乘法和n 1次加法。因此,求出矩...