我們所要介紹的斯特拉森矩陣相乘算法是德國數學家沃爾克·施特拉森 (Volker Strassen) 於1969年提出的,該算法的主要思想是一種分治思想,即將一個2n的方陣分解成4個2n-1的小方陣。
借助這種辦法,任何有窮方陣都可以簡化為有限個2×2方陣,所以今天我們主要介紹斯特拉森算法在2×2方陣上的應用。
首先我們假設有兩個2×2矩陣,A,B.
A = a11 a12 B = b11 b12
a21 a22 b21 b22
我們設矩陣相乘的結果矩陣為C。則
C = c11 c12
c21 c22
由斯特拉森算法可得7個小矩陣
-
-
-
-
-
- m1 = (a12 - a22)(b21 + b22)
- m2 = (a11 + a22)(b11 + b22)
- m3 = (a21-a11)(b11+b12)
- m4 = (a11+a12) * b22
- m5 = a11 * (b12 - b22)
- m6 = a22 * (b21 - b11)
- m7 = (a21 + a22) * b11
-
-
-
-
易得
-
-
-
-
-
- c11 = m6 + m1 + m2 - m4
- c12 = m5 + m4
- c21 = m6 + m7
- c22 = m5 + m3 + m2 - m7
-
-
-
-
應用該種方法可將花費的時間由最開始的Ω(n3 )變成了O(nlg7)又因為lg7在2.80和2.81之間,所以其運行時間為O(n2.81),相比一開始有較為明顯的優化(尤其是在處理較大的矩陣時)。
示例代碼如下:
1 int a[2][2] = { 2,3,4,5 }, 2 b[2][2] = { 1,7,2,6 };//輸入矩陣 3 int c[2][2];//建立結果矩陣 4 int m1 = (a[0][1] - a[1][1]) * (b[1][0] + b[1][1]), 5 m2 = (a[0][0] + a[1][1]) * (b[0][0] + b[1][1]), 6 m3 = (a[1][0] - a[0][0]) * (b[0][0] + b[0][1]), 7 m4 = (a[0][0] + a[0][1]) * b[1][1], 8 m5 = a[0][0] * (b[0][1] - b[1][1]), 9 m6 = a[1][1] * (b[1][0] - b[0][0]), 10 m7 = (a[1][0] + a[1][1]) * b[0][0]; 11 c[0][0] = m6 + m2 + m1 - m4; 12 c[0][1] = m5 + m4; 13 c[1][0] = m6 + m7; 14 c[1][1] = m5 + m3 + m2 - m7;