我必须在两个参考系统(轴)之间进行坐标转换。为此,三个矩阵() 由于使用了一些中间轴,因此必须相乘。我想过两种方法来解决这个问题:
方法#1:直接做乘法,即
方法#2:分成几个步骤:
在哪里:
,和是矩阵
,,,是矢量图
我想知道哪种方法在计算上更有效(时间更短)来进行转换(这将进行很多次)。
我必须在两个参考系统(轴)之间进行坐标转换。为此,三个矩阵() 由于使用了一些中间轴,因此必须相乘。我想过两种方法来解决这个问题:
方法#1:直接做乘法,即
方法#2:分成几个步骤:
在哪里:
,和是矩阵
,,,是矢量图
我想知道哪种方法在计算上更有效(时间更短)来进行转换(这将进行很多次)。
Matlab 解释从左到右的乘法和/或除法序列。因此比贵很多,因为您有两个矩阵乘积和一个矩阵向量乘积代替了三个矩阵向量乘积。
另一方面,正如您的第二种方法所建议的那样,应该比将中间体保存在单独的向量中稍快。
要大致了解如何衡量小的编程差异对大规模计算的影响,请在 Matlab 提示符下写入“帮助配置文件”。
对于初学者,我不会使用中间变量,而是使用括号。当然,除非你对中间结果感兴趣,但我猜不是。
我在 Matlab 中尝试了以下操作:
>> N = 500;
>> A = rand(N); B = rand(N); C = rand(N); v = rand(N,1);
>> tic, for k=1:100, A*B*C*v; end; toc
Elapsed time is 3.207299 seconds.
>> tic, for k=1:100, A*(B*(C*v)); end; toc
Elapsed time is 0.108095 seconds.
不过,我不得不说,这是相当可怕的。我一直认为 Matlab 对矩阵乘法顺序很聪明,因为这是一个简单而有效的解决方案的已知问题。
由于矩阵非常小,所有成本都将在调用开销中。如果您将多次进行转换,预计算D=A*B*C
一次然后为每个向量 apply会更快v_f=D*v_i
。您也可以考虑将其导出到 mex 文件中。