【问题标题】:Strassen's algorithm for matrix multiplicationStrassen 的矩阵乘法算法
【发布时间】:2010-12-27 13:29:26
【问题描述】:

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

【问题讨论】:

  • 您是否在理解第一部分(零填充后分区)或下一步(减少操作次数)方面有困难?
  • 看看这篇尝试pedagogical explanation的论文。

标签: algorithm matrix multiplication strassen


【解决方案1】:

考虑将两个 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 是子矩阵。

【讨论】:

  • 只为补全 AE+BG=M1+M7-M2+M5 , AF+BH=M2+M4 , CE+DG=M3+M5 , CF+DH=M1+M6-M3+ M4
【解决方案2】:

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

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

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

  3. 递归。

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

【讨论】:

    【解决方案3】:

    快速浏览一下 Wikipedia,在我看来,这种算法稍微减少了重新排列方程所需的乘法次数。

    这是一个类比。 x*x + 5*x + 6 中有多少次乘法?两个,对吧? (x+2)(x+3) 中有多少次乘法?一,对吧?但它们是相同的表达方式!

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-14
      • 2012-11-13
      • 1970-01-01
      相关资源
      最近更新 更多