这不是一个主要的vs主要问题。这是基于矩阵乘法的关联属性的与性能相关的计算问题的顺序:A(BC)=(AB)C
如果我有2个矩阵,A
和B
以及向量v
,我希望按特定顺序将它们相乘,例如ABv
,我可以(AB)v
或A(Bv)
。
以编程方式向我发现,如果我使用第二种方法并且总是将矩阵与向量相乘,我会从更少的计算中获得更好的性能。
例如,如果我们处理4x4矩阵:
AB
导致16个单独计算,一个新矩阵,每个结果来自一个点积
Matrix*vector
会产生4次计算,每次计算都来自点积
因此:
(AB)v
是16 + 4点积计算= 20
A(Bv)
是两个矩阵向量积,或4 + 4点积计算= 8
我是否正确思考?这表明,如果我每次都使用向量开始执行这样的许多矢量矩阵表达式会显着提高性能吗?
因此,构造一个矩阵库是有意义的,该矩阵库基于向量*矩阵从左到右的计算顺序执行(即使您选择从右向左标记列主格式),因为将向量与矩阵产品在图形中很常见。
答案 0 :(得分:5)
在矩阵的单个操作和所涉及的单个向量的有限上下文中,你和tmyklebu说得对。但是,在实际应用之前,通常需要注意更大的背景。该问题围绕 A 和 B 相对于 v 更改的频率发生变化的频率。如果 A 和 B 相对静态(它们不会经常更改)与 v 相比,您可能最好不要预先计算 AB 并将其应用于 v 的任何值。
此外,在实践中,存在一些由多个矢量组成的几何体,通过首先计算 AB 然后将该变换应用于几何体中的所有矢量,可以更有效地变换和计算这些几何体。
答案 1 :(得分:2)
你的想法是正确的,是的。找到乘以矩阵链的最佳方法是使用动态规划解决的famous example问题。