问题仅适用于A
,B
,C
和D
作为向量的n*n
和x
长度n
,以最有效的方式在Matlab上以最低效的方式查找E = DCBAx
。
计算E
最明显的方法就是将它们直接相乘
这是最有效的方法吗?什么是效率最低的方式?
答案 0 :(得分:8)
让我们为这个例子创建虚拟矩阵和向量。
n = 1000;
A = rand(n, n);
B = rand(n, n);
C = rand(n, n);
D = rand(n, n);
x = rand(n, 1);
然后我们可以为矩阵产品定义一些函数句柄,我们强制执行操作的顺序
fun1 = @() D*C*B*A*x;
fun2 = @() (D*C*B*A)*x;
fun3 = @() (D*(C*(B*A)))*x;
fun4 = @() D*(C*(B*(A*x)));
使用timeit
进行简单的执行时间评估表明fun1
,fun2
和fun3
几乎以相同的方式执行,而fun4
约为100次快点。这种行为的原因在于,在前三种情况下,我们需要3种矩阵乘积和1种矩阵矢量乘积,而在最后一种情况下,仅执行4种矩阵矢量乘积。有趣的是,Matlab在评估fun1
时无法识别这种简单的优化。