MATLAB矩阵乘法(最佳计算方法)


10

我必须在两个参考系统(轴)之间进行坐标转换。为此,由于使用了一些中间轴,必须将三个矩阵(3×3)相乘。我考虑过两种解决方法:

方法1:直接进行乘法,即

vF=[R1个 [R2 [R3 v一世

方法2:分为以下步骤:

  1. v3一世=[R3 v一世
  2. v23=[R2 v3一世
  3. vF=[R1个 v23

哪里:

[R1个[R2[R33×3矩阵

vF,,,是向量v 3 i v 23 3 × 1v一世v3一世v233×1个

我想知道哪种方法在计算上效率更高(更少的时间)来进行转换(这将被做很多次)。



@ChrisTaylor:非常感谢您的建议。
julianfperez 2012年

2
请不要交叉张贴。
2012年

2
注意,这里有两个问题和StackOverflow交叉发布。问题及其评论和答案已合并到此问题中。
阿隆·艾玛迪亚

@Will和AronAhmadia:对不起。我不知道禁止交叉张贴。我一直将问题发布在StackOverflow上,但是今天我找到了这个新站点,我想也许我也可以在这里找到帮助。
julianfperez

Answers:


17

Matlab从左到右解释乘法和/或除法序列。因此,A B C v 贵得多,因为您拥有两个矩阵乘积和一个矩阵向量乘积来代替三个矩阵向量乘积。一个CvA(B(Cv))

另一方面,如第二种方法所建议的那样,与将中间体保存在单独的向量中相比,应该稍微快一些。一个Cv

要总体上了解如何衡量较小的编程差异对大规模计算的影响,请在Matlab提示“帮助配置文件”中编写。


感谢您提供答案中的有趣信息。
julianfperez

保存中间体为什么会更快?
Federico Poloni's

@FedericoPoloni:我写过,保存中间体要快一些。
Arnold Neumaier

@ArnoldNeumaier哦,抱歉,我读错了。:)
Federico Poloni

14

对于初学者,我不会使用中间变量,而是使用方括号。当然,除非您对中间结果感兴趣,但我猜没有。

我在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在矩阵乘法顺序方面会很聪明,因为这是一个简单有效的解决方案的已知问题


您是否错过了矩阵为3x3的部分?:)
Aron Ahmadia

2
@AronAhmadia:糟糕...想念,谢谢。我猜对于那些矩阵大小,整个问题还没有定论,但是我仍然对大N的结果感到惊讶。–
Pedro

7
我猜想MATLAB遵循C优先级规则进行表达式求值,因为浮点数学不具有关联性,它们必须假设您知道自己在做什么:)
Aron Ahmadia 2012年

2
@Pedro:谢谢你的回答。对于3x3的矩阵,我已经检查过您的解决方案也比通常的(无括号)矩阵乘法好。
julianfperez

+1感谢您展示一种简单易行的方式来测量运行时间
Steven Magana-Zook

14

由于矩阵是如此之小,因此所有成本都将在通话开销中。如果您要进行多次转换,则预先计算D=A*B*C一次,然后对每个向量应用将更快v_f=D*v_i。您也可以考虑将其导出到mex文件中。


谢谢您的回答。在我的情况下,矩阵是旋转矩阵(它们取决于角度值,并且会发生变化),因此乘积A B C并不总是相同的。
julianfperez 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.