本文的閱讀等級:初級
令 和 為 階矩陣。矩陣乘積 需要使用多少乘法與加法運算?根據矩陣乘法定義,
。
因為 階矩陣 有 個元,計算每一元需要 個乘法和 個加法,故知 階矩陣乘積共使用了 個乘法和 個加法。長久以來,人們普遍認為矩陣乘法定義本身即為最佳的算法,這個迷思直到1969年才被施特拉森[1](Volker Strassen) 打破──他提出了一個更快捷的分治 (divide-and-conquer) 矩陣乘法,稱為 Strassen 演算法。
考慮 階分塊矩陣乘法
,
其中每一分塊皆為方陣。傳統的矩陣乘法運算方式,,總共使用8個分塊乘法和4個分塊加法。Strassen 演算法使用7個分塊乘法和18個分塊加法,如下:
直接代入化簡即可驗證上述公式的正確性。假設 ,上面所有分塊皆為 階。傳統的矩陣乘法使用了 個乘法和 個加法。如果 Strassen 演算法僅執行至分塊等級,也就是說, 階分塊乘法仍採用傳統方法計算,則7次分塊乘法共使用 個乘法和 個加法,再加上18次分塊加法使用的 個加法,總計是 個乘法和 個加法。若 ,不論乘法或加法,Strassen 演算法僅耗費傳統方法 7/8 的計算量。
我們可以繼續應用 Strassen 演算法於 階矩陣 涉及的乘法運算。若 ,運用遞歸方式可達成分治效果。令 代表計算 階矩陣乘積所耗用的乘法總數。因為
,
且 (對應 階純量乘法),可得
。
令 表示 Strassen 算法應用於 階矩陣乘法使用的加法總數。由前述分析可知 包含7次 階矩陣乘法使用的 個加法,以及18次 階矩陣加法所需的 個加法,即
。
上式通除以 ,
。
因為 ( 階純量乘法未使用加法),
。
所以 Strassen 演算法的加法總量是
。
在實際應用時,若 不等於 的冪,可將 和 擴充為 和 。不過此舉勢必引入額外的計算量與儲存量。根據2000年的硬體架構,矩陣尺寸必須超過1,000,Strassen 演算法才可能擊敗經過高度優化的傳統算法。即便矩陣尺寸增大至10,000,相較於傳統算法,Strassen 演算法所能提昇的運算效率依然十分有限 (約小於10%)[2]。
Strassen 演算法的推導
考慮 階矩陣乘法
。
乘開上式,
將這四個式子合併成矩陣表達式
。
我們的任務要將上式的 階矩陣分解成數個矩陣之和以期減少乘法運算。分解出來的矩陣至多僅含4個非零元,且所有非零元都位於一 階子陣,例如,
。
考慮下列三種分解型態:
(1) 型態I:子陣有相同的元,需要1個乘法運算,如
。
(2) 型態II:子陣的元有相同的絕對值,但兩行或兩列不同號,需要1個乘法運算,如
。
(3) 型態III:子陣為上或下三角矩陣,且 (非零) 非主對角元等於兩主對角元之差,這時需要2個乘法運算,如
,
型態III可分解為兩個退化的型態I和型態II (所謂退化是指存在零行或零列),如
。
以下是詳細的分解步驟:設法製造型態I和型態II,可能的方式很多,下為一例:
。
令 表示上式等號右邊的第二個矩陣。觀察發現 ,故可繼續製造型態I,如下:
。
令 表示上式等號右邊的第二個矩陣。觀察發現 可分解成兩個型態III:
。
分離等號右邊兩矩陣的相異元,各自可分解成兩個退化型態I和型態II。最後,整理所有的分解矩陣,按照 Strassen 演算法給定的排序,即有
上式也可以表示為「行列展開」的矩陣乘法:
原始的 階矩陣分解成7個型態I或形態II (包含退化情形),所以共使用7個乘法運算。
參考來源:
[1] 維基百科:Volker Strassen
[2] 維基百科:Strassen algorithm
有時候真的很敬佩發明這個算法的人,到底是怎么發現Strassen 演算法所使用的那7個分塊乘法和18個分塊加法?
另外,老師能否介紹一下其他比strassen更好的算法?
我猜想你說的更好算法是Coppersmith–Winograd algorithm。它的漸近分析效率是,不過此法僅有理論價值但不具實用性,因為目前的電腦無法計算超大矩陣乘法。CW算法建立在tensor product,請參見下文介紹:
Click to access matrixmult.pdf
稍後我再將Strassen 演算法的推演過程補上來。
所以您打算貼了嗎?
你問的有點晚了。如果我記得不錯,2013年6月6日便將推演過程貼上,粗體標題 Strassen 演算法的推導以下即是。
Strassen 演算法使用7個分塊乘法和18個分塊加法
是不是应该为:
Strassen 演算法使用7個分塊乘法和8個分塊加法
18 -> 8
请忽略~