斯特拉森矩阵相乘算法(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