我想在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
Run Code Online (Sandbox Code Playgroud)
是否有一个简单的矢量化替换为循环?(或者是否存在我缺少的内置MATLAB函数?)我在非常小的数据集上执行此操作,因此时间不是问题.我只是想改进我的MATLAB编码风格.
除了HIST/HISTC函数之外,您还可以使用ACCUMARRAY计算出现次数(以及许多其他聚合操作)
counts = accumarray(list(:), 1)
%# same as: accumarray(list(:), ones(size(list(:))), [], @sum)
Run Code Online (Sandbox Code Playgroud)
另一种方法是使用统计工具箱中的TABULATE(返回值,计数,频率):
t = tabulate(list)
t =
1 3 27.273
2 5 45.455
3 2 18.182
4 0 0
5 1 9.0909
Run Code Online (Sandbox Code Playgroud)
请注意,如果值不是从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
Run Code Online (Sandbox Code Playgroud)
表示唯一值及其计数(这将仅列出至少出现一次的值)