2つの方法のタイミングの違いや、相対速度が異なる理由を知ることができると思います。
Matlabバージョン2008a(またはそのリリースに近いバージョン)より前は、インタープリター(非常に読みやすいスクリプトとコードの低レベルの実装の間のレイヤー)が再解釈する必要があるため、forループはMatlabコードで大きな打撃を受けました。 forループを介して毎回コーディングします。
そのリリース以降、インタープリターは徐々に改善されてきたため、最新バージョンのMatlabを実行すると、インタープリターはコードを見て「ああ、彼が何をしているのか知っているので、少しだけ最適化させてください」と言うことができます。コードを再解釈することで、他の方法でヒットする可能性があります。
行列の乗算を実行する2つの方法が同じ時間で評価されることを期待します。forループの実装がより高速に実行される理由は、インタープリターの最適化の詳細が原因で、私たち単なる人間にはわかりません。
これから学ぶべき1つの広い教訓は、すべてのバージョンが同じではないということです。私は2つのMatlabアドオン、SimBiologyとParallel Computing Toolboxを使用して、いくつかの最先端のケースに取り組んでいます。どちらも(特にそれらを連携させたい場合は)実行速度がバージョンに依存し、時々その他の安定性の問題。そのため、Matlabの最新の3つのリリースを保持し、各バージョンから同じ回答が得られることをテストします。一部の機能に問題がある場合は、以前のバージョンにロールバックすることがあります。これはおそらくほとんどの人にとってやり過ぎですが、バージョンの違いのアイデアを提供します。
お役に立てれば。
編集:
明確にするために、コードのベクトル化は依然として重要です。しかし、次のようなスクリプトが与えられます:
x_slow = zeros(1,1e5);
x_fast = zeros(1,1e5);
tic;
for i=1:1e5
x_slow(i) = log(i);
end
time_slow = toc; % evaluates for me in .0132 seconds
tic;
x_fast = log(1:1e5);
time_fast = toc; % evaluates for me in .0055 seconds
time_slowとtime_fastの間の不一致は、インタプリタの改善に基づいて、過去のいくつかのバージョンで減少しました。私が見た例は2000a対2008bでしたが、それは私の記憶の対象です。
OliとYukが対処した他の何かが起こっている可能性があります。多くの場合、time_1とtime_2には次のような違いがあります。
tic; x = log(1:1e5); time_1 = toc
tic; x = log(1:1e5); time_2 = toc
したがって、メモリxのどこにあるか(キャッシュ内かどうか)に応じて、100万回の評価と1回の評価のテストが役立ちます。
これが再び役立つことを願っています。