Matlab:有效和无效地矩阵乘法

3
问题很简单,对于大小为n*n的矩阵ABCD以及长度为n的向量x,需要在Matlab中以最高效的方式找到E = DCBAx,以及最低效的方式。
计算E的最明显方法就是直接相乘。
这是最有效的方法吗?最低效的方法是什么?

请参考以下链接:https://dev59.com/aG025IYBdhLWcg3wW0oc? - Fantastic Mr Fox
最低效的确实是一个有点无意义的问题,因为有无限多种解决方案可以表现得平庸。然而,对于这样的操作,使用嵌套循环实现矩阵乘法算法通常与内置矩阵乘法相比表现非常不利。 - sobek
1个回答

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进行简单的执行时间评估显示,fun1fun2fun3的表现几乎相同,而fun4则快了约100倍。这种行为的原因是,在前三种情况下,我们需要进行3个矩阵乘积和1个矩阵-向量乘积,而在最后一种情况下,只执行了4个矩阵-向量乘积。有趣的是,Matlab在评估fun1时无法识别这种简单的优化。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接