我最近在MATLAB中遇到了这个用于循环代码的问题让我感到困惑,因为反向循环更快地做同样的事情。为什么会这样?
clear all
a = rand(1000,1000);
b = rand(1000,1000);
for i=1:1000
for j=1:1000
c(i,j) = a(i,j) + b(i,j);
end
end
与反循环相同的代码:
clear all
a = rand(1000,1000);
b = rand(1000,1000);
for i=1000:-1:1
for j=1000:-1:1
c(i,j) = a(i,j) + b(i,j);
end
end
我在python中使用范围(1000,1,-1)执行相同操作并找到相同的结果(反向循环仍然更快)。
答案 0 :(得分:4)
由于在反向顺序中没有预先分配输出变量c,因此在第一次for循环迭代之后,c最初被预先分配到1000 x 1000矩阵。当你计算c每个循环的大小增加时,这需要在每次迭代时重新分配内存,因此速度较慢。如果你打开它们,Matlab会将此显示为警告。
答案 1 :(得分:2)
反向循环更快,因为第一次迭代(c(1000,1000)=..
)创建一个大小为1000x1000的数组,而第一段代码不断增加变量c的大小。
要避免此类问题,请预先分配您在循环中编写的变量。插入c=zeros(1000,1000)
,两个版本都可以快速运行。您的matlab编辑器会显示警告(黄线),表示潜在的性能问题以及代码的其他问题。阅读这些消息!