2010-08-06 59 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功能。