這可能是由內存分配造成的。情況1
有聲明,創建副本的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(ind)
索引到V
。
這是我的電腦上運行時間:
% 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.
這種語法是新的我 「爲X = V」。也許它與解析這行代碼有關 – User1551892
這種行爲很奇怪。 (儘管第一個循環在我的系統中使用MATLAB 2016a沒有花費太多時間)。我需要1.30〜1.35秒!而第二個循環需要0.60〜0.65秒) –
順便說一句,寫's3 = 0;對於x = 1:50000000,s3 = s3 + x;結束'更快! (s2版本的一半時間) – matheburg