关于MATLAB矢量寻址的性能问题

poe*_*orn 0 matlab

我想知道,解决矢量的单个元素的速度更快:

1)通过直接访问

result = a(index)
Run Code Online (Sandbox Code Playgroud)

要么

2)通过矩阵乘法访问元素,例如

a = [1 2 3 4]';
b = [0 0 1 0];
result = b*a;   % Would return 3
Run Code Online (Sandbox Code Playgroud)

在我的观点(来自"经典"编程,如C++)中,第一种方法必须更高效,因为直接访问......第二种方法需要通过两个向量(?)进行迭代.

我之所以要问的是,matlab在矩阵和向量运算方面非常有效,也许我缺少任何方面,第二种方法更有效......

Dan*_*ode 5

快速测试:

function [] = fun1()
a = [1 2 3 4]';
b = [0 0 1 0];
tic;
for i=1:1000000
    r = a(3);
end
toc;
end
Run Code Online (Sandbox Code Playgroud)

经过时间:0.006秒

更改a(3)b*a

经过时间:0.9秒


性能差异非常明显(在你提出这个问题之前你应该自己完成).

背后的原因:

无论MATLAB的计算效率如何,MATLAB仍然需要1乘以1,并将乘法1乘1,然后求和.没有希望比单一访问更快.

在你的特殊情况下,除了1之外都有0,但在我看来,对于单个特殊情况进行优化是没用的,我能想出的最佳优化仍然需要至少访问所有元素一次.


编辑:

我今天心情似乎很好....

更改a(3)a(1)*b(1)+a(2)*b(2)+a(3)*b(3)+a(4)*b(4)

经过时间:0.02秒

边界检查(和/或其他差事)似乎比访问和计算花费更多时间.