我们所要介绍的斯特拉森矩阵相乘算法是德国数学家沃尔克·施特拉森 (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个小矩阵
-
-
-
-
-
- m1 = (a12 - a22)(b21 + b22)
- m2 = (a11 + a22)(b11 + b22)
- m3 = (a21-a11)(b11+b12)
- m4 = (a11+a12) * b22
- m5 = a11 * (b12 - b22)
- m6 = a22 * (b21 - b11)
- m7 = (a21 + a22) * b11
-
-
-
-
易得
-
-
-
-
-
- c11 = m6 + m1 + m2 - m4
- c12 = m5 + m4
- c21 = m6 + m7
- c22 = m5 + m3 + m2 - m7
-
-
-
-
应用该种方法可将花费的时间由最开始的Ω(n3 )变成了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;