O(N^3)
算法略有改进。它具有更高的常数因子,并且更难实现。鉴于这些缺点,strassens算法实际上是否有用,是否可以在任何库中实现矩阵乘法?此外,如何在库中实现矩阵乘法?
答案 0 :(得分:2)
所以strassen算法的想法是它更快(渐近地说)。如果你正在处理巨大的矩阵或者大量的矩阵乘法,这可能会产生很大的不同。然而,仅仅因为它渐近更快并不能使它成为最有效的算法。存在各种实现注意事项,例如缓存和体系结构特定的怪癖。还需要考虑并行性。
我认为最好的办法是查看常用库,看看他们在做什么。以BLAS为例。我认为Matlab使用MAGMA。
答案 1 :(得分:2)
一般来说,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是解决方案。