1. 程式人生 > 其它 >矩陣乘法的Strassen演算法(下)

矩陣乘法的Strassen演算法(下)

矩陣乘法之Strassen演算法詳細介紹

前言

  上一節我們詳細介紹了基本矩陣乘法和分治遞迴演算法,詳情可見”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
      ),解為O(nlg7)
    • 通過對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

x S1

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演算法的漸進複雜性低於直接的矩陣乘法計算過程,是矩陣乘法的一種時間上改進的方法。