joh*_*ers 5 math 3d graphics matrix
这不是一个主要的vs列主要问题.这是基于矩阵乘法的关联属性的与性能相关的计算问题的顺序:A(BC)=(AB)C
如果我有两个矩阵,A
和B
一个向量v
,我想以一定的顺序将它们相乘,例如ABv
,我可以做(AB)v
或A(Bv)
.
我以编程方式向我发现,如果我使用第二种方法并且总是将矩阵与向量相乘,那么从更少的计算中我可以获得更好的性能.
例如,如果我们处理4x4矩阵:
AB
结果是16个单独的计算,一个新的矩阵,每个结果来自一个点积
Matrix*vector
得到4个计算,每个计算来自一个点积
因此:
(AB)v
是16 + 4点积计算= 20
A(Bv)
是两个矩阵向量积,或4 + 4点积计算= 8
我在想什么?这表明,如果我每次都使用向量,那么执行许多这样的矢量矩阵表达式会显着提高性能吗?
因此,构造一个基于向量*矩阵从左到右计算顺序执行的矩阵库是有意义的(即使你选择用列主格式标记从右到左),因为向量与矩阵乘积相乘是在图形中很常见.
在矩阵的单个操作和所涉及的单个向量的有限环境中,你和tmyklebu是正确的.但是,在实际应用之前,通常需要注意更大的背景.这个问题围绕着A和B相对于v变化频率的变化.如果A和B相对静态(它们不经常变化)与v相比,你可能最好预先计算AB并将其应用于v恰好具有的任何值.
此外,在实践中,存在由多个矢量组成的一些几何形状,其可以通过首先计算AB然后将该变换应用于几何中的所有矢量来一起更有效地变换和计算.