斯特拉森矩陣相乘算法(c語言實現)


我們所要介紹的斯特拉森矩陣相乘算法是德國數學家沃爾克·施特拉森 (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個小矩陣

            1. m= (a12 - a22)(b21 + b22)
            2. m= (a11 + a22)(b11 + b22)
            3. m= (a21-a11)(b11+b12)
            4. m4 = (a11+a12) * b22
            5. m5 = a11 * (b12 - b22)
            6. m6 = a22 * (b21 - b11)
            7. m7 = (a21 + a22) * b11

易得

            1. c11 = m6 + m1 + m2 - m4
            2. c12 = m5 + m4
            3. c21 = m+ m7
            4. c22 = m+ m+ m- m7

應用該種方法可將花費的時間由最開始的Ω(n)變成了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;
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM