6

次のコードのループがあります (ヒストグラムを計算します)。私はMatlabで書いています。私はMatlabが初めてなので、これを行うためのより高速な方法を知りません。現在執筆中です

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

これを行うためのより高速な方法、できれば for ループを必要としない方法はありますか?

4

2 に答える 2

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

詳細については、こちらの素敵な回答を参照してください。

于 2012-09-28T17:40:29.247 に答える
1

aとが両方ともbベクトルの場合、これは機能するはずです。

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

a(b) = a(b) + 1;
于 2012-09-28T17:43:45.103 に答える