2012-09-28 26 views
6

コード(ヒストグラムを計算する)には次のループがあります。私はMatlabに書いています。私はMatlabを初めて使っているので、これを行うためのより速い方法はわかりません。私は現在、好ましくは、forループを必要としないものをこれを行うために任意のより高速な方法はあります ループのmatlabを最適化

for i=1:size(b) 
    a(b(i)) = a(b(i)) + 1; 
end 

を書いていますか?

+2

一般的なコメント: 'size'はあなたが今やっていることのために右の関数ではない、むしろ使用し、[長さ](http://www.mathworks.nl/help/matlab/ref/length.html )または[numel](http://www.mathworks.nl/help/matlab/ref/numel.html)を参照してください。 –

+2

for-loopsが非効率的であるという考えは、可能であれば置き換えなければなりません。このコードをより高速なものに置き換えることはできますが、たぶんわずかな時間を節約できます。これは心配すべきコード最適化のレベルではありません。 – Kavka

+0

@ Kavkaこのタイプのforループに関しては、私は同意します。大きな行列を操作するより複雑なループは、ベクトル化する価値があります。 MatlabはMatrixで動作するように設計されています。そのMatrix演算はすべて最適化されているはずです。 – Derek

答えて

9

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を参照してください。詳細。

+0

私の場合、bは[2 4 2]かもしれないので、(2)を2回増分する必要があります。このメソッドはa(2)を1回だけ更新します。 – anirudh

+0

私はそれに応じて質問を更新しました。 – petrichor

1

abの両方がベクターの場合、これは機能するはずです。

a = 1:100; 
b = 100:-1:1; 

a(b) = a(b) + 1;