コード(ヒストグラムを計算する)には次のループがあります。私はMatlabに書いています。私はMatlabを初めて使っているので、これを行うためのより速い方法はわかりません。私は現在、好ましくは、forループを必要としないものをこれを行うために任意のより高速な方法はあります ループのmatlabを最適化
for i=1:size(b)
a(b(i)) = a(b(i)) + 1;
end
を書いていますか?
コード(ヒストグラムを計算する)には次のループがあります。私はMatlabに書いています。私はMatlabを初めて使っているので、これを行うためのより速い方法はわかりません。私は現在、好ましくは、forループを必要としないものをこれを行うために任意のより高速な方法はあります ループのmatlabを最適化
for i=1:size(b)
a(b(i)) = a(b(i)) + 1;
end
を書いていますか?
a(b) = a(b) + 1
でベクトル化できます。以下を確認してください。
>> a = [1 2 3 4];
>> b = [2 4]; %# indices to modify. Be sure that they are in bounds.
>> a(b) = a(b) + 1
a =
1 3 3 5
あなたは複数回のいくつかの指標を使用する場合は、accumarray
は次のように役立ちます。
>> a = [1 2 3 4];
>> b = [2 4 2];
>> a = accumarray([1:numel(a) b].',[a ones(size(b))])'
a =
1 4 3 5
を別の方法として、あなたが使用することができます。
>> a = [1 2 3 4];
>> b = [2 4 2];
>> b = accumarray(b.',ones(size(b)));
>> a(nzIndex) = a(nzIndex) + b(nzIndex)'
a =
1 4 3 5
ははこちらthis nice answerを参照してください。詳細。
a
とb
の両方がベクターの場合、これは機能するはずです。
a = 1:100;
b = 100:-1:1;
a(b) = a(b) + 1;
一般的なコメント: 'size'はあなたが今やっていることのために右の関数ではない、むしろ使用し、[長さ](http://www.mathworks.nl/help/matlab/ref/length.html )または[numel](http://www.mathworks.nl/help/matlab/ref/numel.html)を参照してください。 –
for-loopsが非効率的であるという考えは、可能であれば置き換えなければなりません。このコードをより高速なものに置き換えることはできますが、たぶんわずかな時間を節約できます。これは心配すべきコード最適化のレベルではありません。 – Kavka
@ Kavkaこのタイプのforループに関しては、私は同意します。大きな行列を操作するより複雑なループは、ベクトル化する価値があります。 MatlabはMatrixで動作するように設計されています。そのMatrix演算はすべて最適化されているはずです。 – Derek