【问题标题】:Is there a more elegant replacement for this MATLAB loop?这个 MATLAB 循环有更优雅的替代品吗?
【发布时间】:2010-08-06 19:56:51
【问题描述】:

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

【问题讨论】:

    标签: matlab histogram


    【解决方案1】:

    除了 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
    

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

    【讨论】:

      【解决方案2】:

      您可以为此使用hist 函数。指定输出,并强制 bin 为数组范围内的整数。

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

      【讨论】:

        【解决方案3】:

        所以,这基本上是一个直方图。不记得了 - 寻找 HIST 函数。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-10-13
          • 1970-01-01
          • 2012-06-29
          • 2018-04-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多