这个MATLAB循环有更优雅的替代品吗?

时间:2010-08-06 19:56:51

标签: matlab histogram

我希望在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编码风格。

3 个答案:

答案 0 :(得分: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

请注意,如果值不是从1米开始,或者如果最小值和最大值之间存在较大间隙,则在计数之间会得到很多零。而是使用:

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

表示唯一值及其计数(这将仅列出至少出现一次的值)

答案 1 :(得分:4)

您可以使用hist功能。指定一个输出,并强制二进制数在整个数组范围内为整数。

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

答案 2 :(得分:0)

所以,这基本上是一个直方图。关闭我的记忆 - 寻找HIST功能。