斯特拉森的矩阵乘法在哪里有用?

时间:2014-04-02 09:27:34

标签: algorithm matrix matrix-multiplication

用于矩阵乘法的Strassen算法仅比传统的O(N^3)算法略有改进。它具有更高的常数因子,并且更难实现。鉴于这些缺点,strassens算法实际上是否有用,是否可以在任何库中实现矩阵乘法?此外,如何在库中实现矩阵乘法?

4 个答案:

答案 0 :(得分:2)

所以strassen算法的想法是它更快(渐近地说)。如果你正在处理巨大的矩阵或者大量的矩阵乘法,这可能会产生很大的不同。然而,仅仅因为它渐近更快并不能使它成为最有效的算法。存在各种实现注意事项,例如缓存和体系结构特定的怪癖。还需要考虑并行性。

我认为最好的办法是查看常用库,看看他们在做什么。以BLAS为例。我认为Matlab使用MAGMA

答案 1 :(得分:2)

一般来说,Strassen的方法不适用于实际应用,原因如下。

  1. Strassen方法中使用的常量很高,对于典型应用,Naive方法效果更好。
  2. 对于稀疏矩阵,有一些特别设计的更好的方法 对他们来说。
  3. 递归中的子矩阵需要额外的空间。
  4. 由于计算机算法的精度有限 非整数值,较大的误差在Strassen算法中累积 而不是朴素方法。

答案 2 :(得分:2)

在正确的时刻停下来是非常重要的。

使用1,000 x 1,000个矩阵,您可以将它们乘以7个500 x 500产品加上一些附加功能。这可能很有用。可能是500 x 500。使用10 x 10矩阵,很可能不是。你必须先做一些实验才能停止。

但是当行数增加32倍时,Strassen算法只保存因子2(最多),系数增加1,024,总时间增加因子16,807而不是32,768。在实践中,这是一个“常数因素”。我会说你通过首先调换第二个矩阵来获得更多,这样你就可以按行相乘,然后仔细查看缓存大小,尽可能地向量化,并分布在不会踩到彼此脚的多个核心上。

答案 3 :(得分:1)

  • 边际改善:确实如此,但随着矩阵规模的增长而增长。
  • 更高的常数因子:Strassen算法的实际实现使用传统的n ^ 3来处理特定大小以下的块,所以这并不重要。
  • 更难实施:无论如何。

至于在实践中使用的是什么:首先,你必须明白,将两个巨大的密集矩阵相乘是异常。更常见的是,它们中的一个或两个是稀疏的,或对称的,或上三角形,或其他一些模式,这意味着有相当多的专用工具对于有效的大矩阵乘法工具箱是必不可少的。话虽如此,对于巨型密集矩阵,Strassen是解决方案。