矩陣乘法的Strassen演算法(下)
阿新 • • 發佈:2021-07-09
矩陣乘法之Strassen演算法詳細介紹
x S1
前言
上一節我們詳細介紹了基本矩陣乘法和分治遞迴演算法,詳情可見”https://www.cnblogs.com/Bosson/p/14987366.html“。
這一節將詳細介紹Strassen演算法。
Strassen演算法
Strassen演算法目的是對分治遞迴演算法的遞迴樹進行剪枝,即從8次遞迴降為7次遞迴。
過程共有四個步驟:
-
- 將A、B、C各自分解為4個子矩陣(與前述相同)
- 建立10個同維度的矩陣Si(i = 1~10),每個矩陣Si儲存A和B的8個子矩陣之間的和或差,需要花費O(n2)
- 利用上述的8個子矩陣和10個Si矩陣,遞迴計算7個矩陣積Pj,時間遞迴演算法為T(n) = 7T(n/2) + O(n2
- 通過對Pj的不同組合進行加減運算,計算出矩陣C的4個子矩陣,需要花費O(n2)
接下來開始介紹Strassen演算法的細節。
在步驟二中,我們需要建立10個Si矩陣如下所示:
S1 = B12 - B22
S2 = A11 + A12
S3 = A21 + A22
S4 = B21 - B11
S5 = A11 + A22
S6 = B11 + B22
S7 = A12- A22
S8 = B21 + B22
S9 = A11 - A21
S10 = B11 + B12
在步驟三中,我們需要遞迴計算7次n/2 x n/2子矩陣的乘法,如下所示:
P1 = A11
P2 = S2 x B22
P3 = S3 x B11
P4 = A22 x S4
P5 = S5 x S6
P6 = S7 x S8
P7 = S9 x S10
在步驟四中,我們需要利用Pj矩陣進行加減法運算,計算出C的4個子矩陣,如下所示:
C11 = P5 + P4 - P2 + P6
C12 = P1 + P2
C21 = P3 + P4
C22 = P5 + P1 - P3 - P7
經過驗算,可以發現C的4個子矩陣結果與分治遞迴演算法中的結果是一致的。
總結
步驟三中遞迴式的解為O(nlg7),lg7 ≈ 2.81,即Strassen演算法的漸進複雜性低於直接的矩陣乘法計算過程,是矩陣乘法的一種時間上改進的方法。