次のコードのループがあります (ヒストグラムを計算します)。私はMatlabで書いています。私はMatlabが初めてなので、これを行うためのより高速な方法を知りません。現在執筆中です
for i=1:size(b)
a(b(i)) = a(b(i)) + 1;
end
これを行うためのより高速な方法、できれば for ループを必要としない方法はありますか?
次のコードのループがあります (ヒストグラムを計算します)。私はMatlabで書いています。私はMatlabが初めてなので、これを行うためのより高速な方法を知りません。現在執筆中です
for i=1:size(b)
a(b(i)) = a(b(i)) + 1;
end
これを行うためのより高速な方法、できれば for ループを必要としない方法はありますか?
で簡単にベクトル化できます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
詳細については、こちらの素敵な回答を参照してください。
a
とが両方ともb
ベクトルの場合、これは機能するはずです。
a = 1:100;
b = 100:-1:1;
a(b) = a(b) + 1;