Matlab:for vector on vector。奇怪的速度行为?

时间:2016-11-22 16:14:10

标签: matlab loops for-loop optimization

我在matlab上使用for循环玩了一下,我知道通常可以避免它们,在这种情况下,速度要快得多。但如果我真的想要通过矢量V的所有元素,我做了那个小测试:

n=50000000;
V =1:n;

s1 = 0;
tic
for x=V
    s1 = s1+x;
end
toc

s2 = 0;
tic
for ind=1:numel(V)
    s2 = s2+V(ind);
end
toc

s1和s2相等(正常)但第一次循环需要24.63秒而第二次循环只需0.48秒。

我对这些数字感到有些惊讶。它是否已知?有人有任何解释吗?

1 个答案:

答案 0 :(得分:4)

这可能是由内存分配引起的。案例1中的陈述,

  

for x=V

必须创建V的副本。我们为什么知道?如果您在循环中V修改了x,则不会受到影响:它仍会运行原始的V值。

另一方面,案例2中的陈述,

  

for ind=1:numel(V)

实际上并未创建向量1:numel(V)。来自help for

  

当冒号表达式出现在for语句中时,长循环的内存效率更高,因为从不创建索引向量。

不需要分配内存的事实可能是速度增加的原因,至少部分是这样。

要对此进行测试,请将for ind=1:numel(V)更改为for ind=[1:numel(V)]。这将强制创建向量1:numel(V)。然后,运行时间应该类似于案例1,或者确实稍微大一点,因为我们仍然需要使用V索引到V(ind)

这些是我电脑上的运行时间:

% Case 1
n=50000000;
V =1:n;
s1 = 0;
tic
for x=V
    s1 = s1+x;
end
toc

% Case 2
s2 = 0;
tic
for ind=1:numel(V)
    s2 = s2+V(ind);
end
toc

% Case 3
s3 = 0;
tic
for ind=[1:numel(V)]
    s3 = s3+V(ind);
end
toc

结果:

Elapsed time is 0.610825 seconds.
Elapsed time is 0.182983 seconds.
Elapsed time is 0.831321 seconds.