/編集: ループは遅くなりません。時間を正しくとれませんでした。ラスマンの答えを見てください。
やや長くて複雑な関数の 3 つのパラメーターをループしていますが、理解できない 2 つのことに気付きました。
- 関数は 1 つの構造体 (必要なフィールドは 1 つだけ) を返すだけですが、反復ごとに上書きします。
- プロファイラーは
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
どうすればこれをスピードアップできますか? すべての反復が前の反復よりも長くかかるのはなぜですか? これは恐ろしいプログラミングだと確信しています。申し訳ありません。