我有以下循环代码(计算直方图)。我在Matlab写作。由于我是Matlab的新手,我不知道有任何更快的方法可以做到这一点。我正在写作
for i=1:size(b)
a(b(i)) = a(b(i)) + 1;
end
有没有更快的方法来执行此操作,最好是那些不需要for循环的方法?
答案 0 :(得分: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。
答案 1 :(得分:1)
如果a
和b
都是向量,那么这应该可行。
a = 1:100;
b = 100:-1:1;
a(b) = a(b) + 1;