关于ZAKER 融媒体解决方案 合作 加入

Matlab:用于向量的循环 . 怪异的速度行为?

CocoaChina 11-12

我在 matlab 上使用了 for 循环 , 我知道经常可以避免它们 , 在这种情况下 , 速度要快得多 . 但是 , 如果我真的想遍历向量 V 的所有元素 , 我做了一点测试:

n=50000000;V =1:n;s1 = 0;ticfor x=V s1 = s1+x;endtocs2 = 0;ticfor ind=1:numel ( V ) s2 = s2+V ( ind ) ;endtoc

s1 和 s2 相等 ( 正常 ) , 但第一个循环只需要 24.63 秒 , 第二个循环只需要 0.48 秒 .

这些数字让我有些惊讶 . 这是已知的吗?有人有什么解释吗?

最佳答案

这可能是由内存分配引起的 . 情况 1 的陈述

for x=V

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

另一方面 , 情况 2 的陈述

for ind=1:numel ( V )

实际上并没有创建向量 1:numel ( V ) . 从帮助 ,

Long loops are more memory efficient when the colon expression appears in the for statement since the index vector is never created.

不需要分配内存的事实可能至少在一定程度上说明了速度的提高 .

为了测试这一点 , 让我们将 ind = 1:numel ( V ) 更改为 ind = [ 1:numel ( V ) ] . 这将强制创建矢量 1:numel ( V ) . 然后 , 运行时间应该与情况 1 相似 , 或者实际上会更长一些 , 因为我们仍然需要使用 V ( ind ) 索引到 V.

这些是我计算机上的运行时间:

% Case 1n=50000000;V =1:n;s1 = 0;ticfor x=V s1 = s1+x;endtoc% Case 2s2 = 0;ticfor ind=1:numel ( V ) s2 = s2+V ( ind ) ;endtoc% Case 3s3 = 0;ticfor ind= [ 1:numel ( V ) ] s3 = s3+V ( ind ) ;endtoc

结果:

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

以上内容由"CocoaChina"上传发布 查看原文
相关标签 速度行为

觉得文章不错,微信扫描分享好友

扫码分享