矩阵乘法的Strassen算法(下)
作者:互联网
前言
上一节我们详细介绍了基本矩阵乘法和分治递归算法,详情可见”https://www.cnblogs.com/Bosson/p/14987366.html“。
这一节将详细介绍Strassen算法。
Strassen算法
Strassen算法目的是对分治递归算法的递归树进行剪枝,即从8次递归降为7次递归。
过程共有四个步骤:
-
- 将A、B、C各自分解为4个子矩阵(与前述相同)
- 创建10个同维度的矩阵Si(i = 1~10),每个矩阵Si保存A和B的8个子矩阵之间的和或差,需要花费O(n2)
- 利用上述的8个子矩阵和10个Si矩阵,递归计算7个矩阵积Pj,时间递归算法为T(n) = 7T(n/2) + O(n2),解为O(nlg7)
- 通过对Pj的不同组合进行加减运算,计算出矩阵C的4个子矩阵,需要花费O(n2)
接下来开始介绍Strassen算法的细节。
在步骤二中,我们需要创建10个Si矩阵如下所示:
S1 = B12 - B22
S2 = A11 + A12
S3 = A21 + A22
S4 = B21 - B11
S5 = A11 + A22
S6 = B11 + B22
S7 = A12 - A22
S8 = B21 + B22
S9 = A11 - A21
S10 = B11 + B12
在步骤三中,我们需要递归计算7次n/2 x n/2子矩阵的乘法,如下所示:
P1 = A11 x S1
P2 = S2 x B22
P3 = S3 x B11
P4 = A22 x S4
P5 = S5 x S6
P6 = S7 x S8
P7 = S9 x S10
在步骤四中,我们需要利用Pj矩阵进行加减法运算,计算出C的4个子矩阵,如下所示:
C11 = P5 + P4 - P2 + P6
C12 = P1 + P2
C21 = P3 + P4
C22 = P5 + P1 - P3 - P7
经过验算,可以发现C的4个子矩阵结果与分治递归算法中的结果是一致的。
总结
步骤三中递归式的解为O(nlg7),lg7 ≈ 2.81,即Strassen算法的渐进复杂性低于直接的矩阵乘法计算过程,是矩阵乘法的一种时间上改进的方法。
标签:10,递归,矩阵,个子,Strassen,算法,乘法 来源: https://www.cnblogs.com/Bosson/p/14987604.html