【发布时间】:2012-06-05 07:59:34
【问题描述】:
取两个 3x3 矩阵 A*B=C 的乘积。天真地,这需要使用 standard algorithm 进行 27 次乘法运算。如果有人聪明,你可以只使用 23 次乘法,a result found in 1973 by Laderman。该技术涉及节省中间步骤并以正确的方式组合它们。
现在让我们修复一种语言和一种类型,比如带有double 元素的 C++。如果 Laderman 算法是硬编码而不是简单的双循环,我们能否期望现代编译器的性能能够消除算法的差异?
关于这个问题的说明:这是一个编程网站,这个问题是在时间关键内循环的最佳实践的上下文中提出的;过早优化这不是。作为 cmets,我们非常欢迎有关实施的提示。
【问题讨论】:
-
"...我们能否期望现代编译器的性能能够消除算法的差异?"为什么不试试呢?编写两个代码,分别运行 1000 次并比较运行时间。
-
该问题的一般答案是“否”。世界上仍然需要聪明的算法。
-
@phs:回答标题中的问题,还是回答注释上方的问题?他们是相反的。
-
由于 Makarov 还有一种技术只需要 22 次乘法 (original in Russian, PDF;English translation, behind paywall)
-
后期评论:拉德曼算法的优点只有在递归地用于更大的矩阵时才会显现出来。 Paolo D'Alberto 在他的FastMMW site 中对此进行了实验分析。在乘法复杂度方面,Laderman 算法 O(n^2.854) 优于朴素 O(n^3),但与 Strassen 算法 O(n^2.807) 相比逊色。具有 21 次乘法 O(n^2.77) 的 3x3 算法将优于 Strassen 的算法。
标签: c++ algorithm linear-algebra matrix-multiplication