Math 向量矩阵乘法顺序会影响性能吗?

Math 向量矩阵乘法顺序会影响性能吗?,math,matrix,graphics,3d,Math,Matrix,Graphics,3d,这不是一个行主要与列主要的问题。这是一个与性能相关的计算问题顺序,基于矩阵乘法的关联特性:A(BC)=(AB)C 如果我有两个矩阵,A和B,还有一个向量v,我想把它们按一定的顺序相乘,例如ABv,我可以做(AB)v或A(Bv) 从编程的角度来看,如果我使用第二种方法并且总是将矩阵与向量相乘,我会从少得多的计算中获得更好的性能 例如,如果我们处理4x4矩阵: AB产生16个单独的计算结果,一个新的矩阵,每个结果来自一个点积 矩阵*向量产生4个计算结果,每个计算结果来自一个点积 因此: (AB)v为

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

如果我有两个矩阵,
A
B
,还有一个向量
v
,我想把它们按一定的顺序相乘,例如
ABv
,我可以做
(AB)v
A(Bv)

从编程的角度来看,如果我使用第二种方法并且总是将矩阵与向量相乘,我会从少得多的计算中获得更好的性能

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

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

矩阵*向量
产生4个计算结果,每个计算结果来自一个点积

因此:

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

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

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


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

您的想法是正确的,是的。找到矩阵链相乘的最佳方法是一个可以使用动态规划解决的问题。

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


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

这很有趣;因为在3D图形中,我们通常在计算中处理4x4矩阵和通常位于链一端的4元素向量,这个问题似乎更容易诊断,并导致一个简单的观察结果,即始终从向量开始,并确保每次计算都涉及向量是正确的方法。@Fellowshee:是的,但在3D图形之外,大矩阵更常见:)(当然,除了一个方便的DP示例之外,我从未见过任何人使用矩阵链乘法。)+1注意到静态AB应用于各种不同向量的情况,这在graphics中确实经常发生。and和tmyklebu已经正确地解释了它。作为我要补充的进一步见解,在计算机图形学中,特别是在使用可编程转换管道时,通常处理准静态矩阵(矩阵是大量向量的常数)。通常您有一个计算机视图·模型矩阵
MV
和一个投影矩阵
P
MV
通常压缩大量变换,某些计算(照明)需要中间产品
MV.v
但是,现代图形硬件(GPU)有一个重要的发展:虽然早期GPU是矢量架构(Shader Model 2),但Shader Model 3 GPU实际上是(super)标量体系结构,通过并行执行常规标量操作来实现矢量化。这会稍微改变数字。但是,通过点积操作执行内部/点积仍然比手动执行标量舞蹈更快。@datenwolf谢谢,我还问了一个关于着色器如何工作的问题直接针对以下对象执行此计算:eficiency@datenwolf我不知道你是否在OpenGL论坛上,也许我应该在这里提出这个问题,但我知道你已经实现了自己的线性代数库,你可能对我遇到的这个特殊难题有一些见解: