3

/edit:循环不会变慢。我没有正确把握时间。见拉斯曼的回答。

我正在为一个有点长而复杂的函数循环 3 个参数,我注意到两件我不明白的事情:

  1. 每次连续迭代执行都会变慢,尽管该函数只返回一个结构(我只需要一个字段),每次迭代都会覆盖它。
  2. 分析器显示end最里面的语句for需要很长时间。

考虑以下示例(我知道这可以很容易地向量化,但据我所知,我调用的函数不能):

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

我怎样才能加快速度?为什么每次迭代都比前一次花费更长的时间?我很确定这是一个可怕的编程,对此感到抱歉。

4

3 回答 3

2

当我用和 plot替换对的调用doSomething时,我发现每次调用都需要越来越长的时间,显然。output(i,4)=toc;diff(output(:,4))fprintf

删除if-clause每次迭代的收益大约需要相同的时间。

于 2013-02-25T23:01:03.163 回答
1

doSomething如果返回多个输出变量而不是结构,它会快得多

function [out1,out2] = doSomething( x, y, z )
    out1 = x+y+z;
    out2 = x-y-z;
end

它在每次后续迭代中变慢的事实很奇怪,我对此没有任何解释,但希望这至少能让你加快一些速度。

于 2013-02-25T23:07:25.527 回答
1

因此,当我将 if 语句替换为:

if mod(i,1e4) == 0 % only for demonstration, not in final script
    fprintf(1,'time for last 10000 iterations: %f \n',toc); tic;
end

我认为对 toc 的操作可能会导致问题

于 2013-02-25T23:08:38.467 回答