2010-08-06 24 views
4

我想更好地在MATLAB中矢量化我的循環。目前,我正在計算int列表中值的出現次數。我的代碼與此類似:這個MATLAB循環有更好的替代嗎?

list = [1 2 2 3 1 3 2 2 2 1 5]; 
occurrence_list = zeros(1,max(list)); 

for x=list 
    occurrence_list(x) = occurrence_list(x) + 1; 
end 

是否有簡單的矢量化替代for循環? (或者是否有內置的MATLAB函數,我錯過了?)我在非常小的數據集上這樣做,所以時間不是問題。我只是想改善我的MATLAB編碼風格。

回答

5

除了HIST/HISTC功能,您可以使用ACCUMARRAY數發生(以及其他一些聚合操作的)

counts = accumarray(list(:), 1) 
%# same as: accumarray(list(:), ones(size(list(:))), [], @sum) 

另一種方法是使用TABULATE從統計工具箱(返回值,計數頻率):

t = tabulate(list) 
t = 
      1   3  27.273 
      2   5  45.455 
      3   2  18.182 
      4   0   0 
      5   1  9.0909 

注意,在情況下,值不1m處或情況下還有的最小值和最大值,你會之間較大的差距開始在計數之間獲得大量的零。而是使用:

list = [3 11 12 12 13 11 13 12 12 12 11 15]; 
v = unique(list); 
table = [v ; histc(list,v)]' 

table = 
    3  1 
    11  3 
    12  5 
    13  2 
    15  1 

代表的獨特的價值觀和他們的計數(這隻有在至少一個出現列表值)

4

您可以使用hist函數。指定一個輸出,並強制這個bin是你數組範圍內的整數。

list = [1 2 2 3 1 3 2 2 2 1 5]; 
bins = min(list):max(list); 
counts = hist(list,bins); 
+0

完美。謝謝! – 2010-08-06 20:07:12

0

所以,這基本上是一個直方圖。離開我的記憶 - 尋找HIST功能。

相關問題