5

这不是行主要与列主要的问题。这是一个与性能有关的计算顺序问题,基于矩阵乘法的关联属性:A(BC)=(AB)C

如果我有 2 个矩阵,AB,和一个向量v,并且我想以特定顺序将它们全部相乘,例如ABv,我可以做(AB)vor A(Bv)

在我看来,以编程方式,如果我使用第二种方法并始终将矩阵与向量相乘,我可以从更少的计算中获得更好的性能。

例如,如果我们正在处理 4x4 矩阵:

AB结果 16 个单独的计算,一个新的矩阵,每个结果都来自一个点积

Matrix*vector产生 4 个计算,每个计算来自一个点积

所以:

(AB)v是 16+4 点积计算=20

A(Bv)是两个矩阵向量积,或 4+4 点积计算 = 8

我的想法正确吗?这表明如果我每次都从向量开始,执行许多这样的向量矩阵表达式会显着提高性能?

因此,构造一个基于向量*矩阵从左到右计算顺序执行的矩阵库是有意义的(即使您选择使用列主要格式从右到左表示),因为将向量乘以矩阵乘积是在图形中很常见。

4

2 回答 2

5

在矩阵的单个操作和涉及的单个向量的有限上下文中,您和 tmyklebu 做对了。但是,在实践中应用它之前,您通常需要了解更大的上下文。这个问题围绕着AB的变化频率相对于v的变化频率。如果AB与v相比是相对静态的(它们不会经常变化),那么最好预先计算AB并将其应用于v恰好具有的任何值。

此外,在实践中,有一些几何由多个向量组成,可以通过首先计算AB然后将该变换应用于几何中的所有向量来更有效地转换和计算这些向量。

于 2013-06-06T04:07:38.640 回答
3

你的想法是对的,是的。找到乘以矩阵链的最佳方法是使用动态规划可解决问题的一个著名示例

于 2013-06-06T03:49:25.093 回答