私は機械学習コードを書いていますが、基本的な for ループを使用した反復的な方法ではなく、行列操作を使用していくつかの操作を行う方法を見つけるのに苦労しています。反復以外のマトリックスを使用すると、それほど大きな違いが生じると思いますか、それとも無視できるパフォーマンスの違いだと思いますか?
1 に答える
歴史的に、matlab のループは非常に低速でした。ただし、新しい JIT コンパイル ループを持つ Matlab のバージョンでは、非常に高速になる可能性があります。
Matlab では、言語全体がベクトル ベースの操作用に設計されているため、可能な限りループを回避することをお勧めします。MATLAB コードを記述する場合、ベクトル ベースの数学を使用する代わりに、ベクトルをループするスタイルは不適切と見なされます。
良い matlab コード:
[a b] = deal( rand(10,1) );
c = a+b;
悪い matlab コード:
[a b] = deal( rand(10,1) );
c = zero(10,1);
for i = 1:10
c(i) = a(i) + b(i);
これらの実装はどちらも「正しい」ですが、matlab プログラマーの 99% は最初の実装を使用します。さらに、どの matlab プログラマーも最初の実装を見て、コードが何を意味するかを正確に知ることができます。
パフォーマンスに関しては、実際には実装の詳細に依存するため、ベクトル操作がループよりも高速かどうかを事前に判断するのは困難です。ただし、私の経験では、ベクトル関数がループよりも遅いことはめったにありません。ループなしでは解決できないアルゴリズムの問題に遭遇しました。ベクトル ベースのソリューションを発見したとき、計算時間が数分から 1 秒未満に短縮されました。このインデックス作成アルゴリズムを最適化するにはどうすればよいですか