我对代码(计算直方图)有以下循环。我正在用Matlab编写。由于我是Matlab新手,我不知道任何更快的方法来做到这一点。我正在写针对循环优化matlab
for i=1:size(b)
a(b(i)) = a(b(i)) + 1;
end
有没有更快的方法来做到这一点,最好是那些不需要for循环?
我对代码(计算直方图)有以下循环。我正在用Matlab编写。由于我是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
见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循环效率低下/慢,应该尽可能替换的想法是没有根据的。即使您可以用更快的代码替换此代码,您也可能仅节省一小部分时间。这不是您应该担心的代码优化级别。 – Kavka
@Kavka关于这种for循环,我同意。对于处理大型矩阵的循环来说,更复杂的做法是值得向量化的,对吗? Matlab被设计为与矩阵一起工作 - 所有的矩阵运算都应该被优化。 – Derek