/edit:循环不会变慢。我没把握好时间。请参阅拉斯曼的回答。
我正在为一个有点长且复杂的函数循环 3 个参数,我注意到有两件事我不明白:
- 虽然函数只返回一个结构(我只需要其中的一个字段),但每次迭代都会覆盖它,因此执行速度会随着每次连续迭代而变慢。
- 探查器显示最里面的
for
的end
语句需要很长时间。
考虑以下示例(我知道这可以很容易地进行矢量化,但据我所知,我调用的函数不能):
function stuff = doSomething( x, y, z )
stuff.one = x+y+z;
stuff.two = x-y-z;
end
以及我如何执行函数
n = 50;
i = 0;
currenttoc = 0;
output = zeros(n^3,4);
tic
for x = 1:n
for y = 1:n
for z = 1:n
i = i + 1;
output(i,1) = x;
output(i,2) = y;
output(i,3) = z;
stuff = doSomething(x,y,z);
output(i,4) = stuff.one;
if mod(i,1e4) == 0 % only for demonstration, not in final script
currenttoc = toc - currenttoc;
fprintf(1,'time for last 10000 iterations: %f \n',currenttoc)
end
end
end
end
我怎样才能加快速度?为什么每次迭代花费的时间都比前一次长?我很确定这是糟糕的编程,对此深表歉意。
最佳答案
当我用 output(i,4)=toc;
替换对 doSomething
的调用时,我绘制了 diff(output(:,4))
,显然,每次调用 fprintf
的时间都越来越长。
删除 if-clause
返回到每次迭代花费的时间大致相同。
关于MATLAB:嵌套 for 循环每次连续迭代都需要更长的时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15078021/