Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance Matlab:高效和低效地乘法矩阵_Performance_Matlab_Matrix - Fatal编程技术网

Performance Matlab:高效和低效地乘法矩阵

Performance Matlab:高效和低效地乘法矩阵,performance,matlab,matrix,Performance,Matlab,Matrix,问题只在于矩阵A、B、C和D,它们分别是n*n和x,它们是长度n的向量,在Matlab上以最有效的方式和最低效的方式找到E=DCBAx 计算E最明显的方法就是直接将它们相乘 这是最有效的方法吗?效率最低的方法是什么?让我们为这个例子创建虚拟矩阵和向量 n = 1000; A = rand(n, n); B = rand(n, n); C = rand(n, n); D = rand(n, n); x = rand(n, 1); 然后我们可以为矩阵积定义一些函数句柄,在这些句柄中我们强制执行操作

问题只在于矩阵
A
B
C
D
,它们分别是
n*n
x
,它们是长度
n
的向量,在Matlab上以最有效的方式和最低效的方式找到
E=DCBAx

计算
E
最明显的方法就是直接将它们相乘


这是最有效的方法吗?效率最低的方法是什么?

让我们为这个例子创建虚拟矩阵和向量

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

时,它无法识别这个简单的优化相关:?效率最低确实是一个有点没有实际意义的问题,有无限多的解决方案会表现平庸。然而,对于此类操作,与内置矩阵乘法相比,使用嵌套循环实现矩阵乘法算法的性能通常非常差。