Strassen的矩阵乘法算法

时间:2009-12-17 07:23:37

标签: algorithm matrix multiplication strassen

有人可以用直观的方式解释strassen的矩阵乘法算法吗?我已经完成了(好了,试图通过)书中的解释和维基,但它没有点击楼上。网络上使用大量英语而非正式表示法等的任何链接也会有所帮助。是否有任何类比可以帮助我从头开始构建这个算法而不必记住它?

3 个答案:

答案 0 :(得分:41)

考虑将两个2x2矩阵相乘,如下所示:

A B * E F = AE+BG AF+BH
C D   G H   CE+DG CF+DH

计算右侧的显而易见的方法是进行8次乘法和4次加法。但是想象乘法比加法要贵很多,所以我们希望尽可能减少乘法次数。 Strassen使用一个技巧来计算右手边,减少一次乘法和更多的加法(以及一些减法)。

以下是7次乘法:

M1 = (A + D) * (E + H) = AE + AH + DE + DH
M2 = (A + B) * H = AH + BH
M3 = (C + D) * E = CE + DE
M4 = A * (F - H) = AF - AH
M5 = D * (G - E) = DG - DE
M6 = (C - A) * (E + F) = CE + CF - AE - AF
M7 = (B - D) * (G + H) = BG + BH - DG - DH

因此,为了计算AE + BG,从M1 + M7(它获得AE和BG术语)开始,然后添加/减去其他一些Ms,直到我们剩下的AE + BG。奇迹般地,选择M是为了使M1 + M7-M2 + M5正常工作。与其他3项结果相同。

现在只是意识到这不仅适用于2x2矩阵,而且适用于A..H为子矩阵的任何(偶数)大小的矩阵。

答案 1 :(得分:29)

在我看来,您需要获得3个想法:

  1. 您可以将矩阵拆分为块,并对生成的块矩阵进行操作,就像在数字矩阵上一样。特别是你可以将两个这样的块矩阵相乘(当然,只要一个中的块行数与另一个中的块列数相匹配),就可以得到与乘以原始矩阵矩阵时相同的结果。

  2. 表达2x2块矩阵乘法结果所需的块具有足够的公因子,允许以比原始公式所暗示的更少的乘法计算它们。这是Tony's answer中描述的技巧。

  3. 递归。

  4. Strassen算法只是上述的一个应用。要理解对其复杂性的分析,你需要阅读Ronald Graham,Donald Knuth和Oren Patashnik的“Concrete Mathematics”或类似的书。

答案 2 :(得分:26)

快速浏览维基百科,在我看来,这个算法重新排列方程所需的乘法次数略有减少。

这是一个类比。 x*x + 5*x + 6中有多少次乘法?二,对吗? (x+2)(x+3)中有多少次乘法?一个吧?但他们的表情是一样的!

注意,我不希望这提供对算法的深入理解,只是一种直观的方式,您可以理解该算法如何可能导致计算复杂性的提高。