2012-09-28 118 views
6

我对代码(计算直方图)有以下循环。我正在用Matlab编写。由于我是Matlab新手,我不知道任何更快的方法来做到这一点。我正在写针对循环优化matlab

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

有没有更快的方法来做到这一点,最好是那些不需要for循环?

+2

一般性评论:'size'是不是你现在正在做什么是正确的功能,而使用[长度](http://www.mathworks.nl/help/matlab/ref/length.html )或[numel](http://www.mathworks.nl/help/matlab/ref/numel.html)。 –

+2

for循环效率低下/慢,应该尽可能替换的想法是没有根据的。即使您可以用更快的代码替换此代码,您也可能仅节省一小部分时间。这不是您应该担心的代码优化级别。 – Kavka

+0

@Kavka关于这种for循环,我同意。对于处理大型矩阵的循环来说,更复杂的做法是值得向量化的,对吗? Matlab被设计为与矩阵一起工作 - 所有的矩阵运算都应该被优化。 – 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)一次。 – anirudh

+0

我已经更新了相应的问题。 – petrichor

1

如果ab都是矢量,则应该起作用。

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

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