對於矩陣乘法 c = a × b ,通常的做法是將矩陣進行分塊相乘,如下圖所示:
從上圖可以看出這種分塊相乘總共用了 8 次乘法,當然對於子矩陣相乘(如 a0 × b0 ),還可以繼續遞迴使用分塊相乘。對於中小矩陣來說,很適合使用這種分塊乘法,但是對於大矩陣來說,遞迴的次數較多,如果能減少每次分塊乘法的次數,那麼效能將可以得到很好的提高。
strassen 矩陣乘法就是採用了乙個簡單的運算技巧,將上面的 8 次矩陣相乘變成了 7 次乘法,看別小看這減少的 1 次乘法,因為每遞迴 1 次,效能就提高了 1/8 ,比如對於 1024*1024 的矩陣,第 1 次先分解成 7 次 512*512 的矩陣相乘,對於 512*512 的矩陣,又可以繼續遞迴分解成 256*256 的矩陣相乘, … ,一直遞迴下去,假設分解到 64*64 的矩陣大小後就不再遞迴,那麼所花的時間將是分塊矩陣乘法的 (7/8) * (7/8) * (7/8) * (7/8) = 0.586 倍,提高了快接近一倍。當然這是理論上的值,因為實際上 strassen 乘法增加了其他運算開銷,實際效能會略低一點。
下面就是 strassen 矩陣乘法的實現方法,
m1 = (a0 + a3) × (b0 + b3)
m2 = (a2 + a3) × b0
m3 = a0 × (b1 - b3)
m4 = a3 × (b2 - b0)
m5 = (a0 + a1) × b3
m6 = (a2 - a0) × (b0 + b1)
m7 = (a1 - a3) × (b2 + b3)
c0 = m1 + m4 - m5 + m7
c1 = m3 + m5
c2 = m2 + m4
c3 = m1 - m2 + m3 + m6
在求解 m1,m2,m3,m4,m5,m6,m7 時需要使用 7 次矩陣乘法,其他都是矩陣加法和減法。
下面看看 strassen 矩陣乘法的序列實現偽**:
serial_strassenmultiply(a, b, c)
矩陣置零的優化演算法 簡單易懂
問題 給定乙個 m x n 的矩陣,如果乙個元素為 0 則將其所在行和列的所有元素都設為 0 請使用 原地 演算法。高階 乙個直觀的解決方案是使用 o mn 的額外空間,但這並不是乙個好的解決方案。乙個簡單的改進方案是使用 o m n 的額外空間,但這仍然不是最好的解決方案。你能想出乙個僅使用常量空...
矩陣相乘優化演算法實現講解
什麼是矩陣?在數學中,矩陣 matrix 是指縱橫排列的二維資料 最早來自於方程組的係數及常數所構成的方陣。這一概念由19世紀英國數學家凱利首先提出。矩陣是高等代數學中的常見工具,也常見於統計分析等應用數學學科中。並且在acm競賽,有很多涉及到矩陣知識的題。許多演算法都會結合矩陣來處理,而比較具有代...
演算法之矩陣快速冪優化
3.斐波那契f n f n 1 f n 3 4.應用 這種解法的關鍵在於矩陣的賦值 1,1 1,0 這裡的賦值是比較容易的 include using namespace std typedef vectorlong long vec typedef vector long long veca co...