如何累积整数序列的出现次数?

时间:2013-12-20 15:53:03

标签: matlab bsxfun accumarray

我有一系列整数,比如arr = [1,5,2,2,5,1]

我需要一个结构,比如Counter,它可以告诉我整数出现的次数。

我有以下代码但由于isfield无法以这种方式使用,因此无效。

for i = 1 : length(arr)
  if ~isfield(Counter, i)
    Counter{i} = 0;
  end
  Counter{i} = Counter{i} + 1
end

那么有没有优雅的方法可以累积整数序列的出现次数?

2 个答案:

答案 0 :(得分:3)

A = [1 2 1 2 3 3 1 4 5 5 6];
numbers = unique(A); % [1, 2, 3, 4, 5, 6] unique elements
count = histc(A, numbers); % [3, 2, 2, 1, 2, 1] occurrence of the element

两个核心命令是uniquehistc

答案 1 :(得分:2)

除了histc之外还有两种可能性:

  1. 使用bsxfun测试相等性,然后对每个数字的所有巧合求和:

    A = [1 2 1 2 3 3 1 4 5 5 6];
    count = sum(bsxfun(@eq, A(:), min(A):max(A)));
    
  2. 使用accumarray对每个号码的每次出现加1

    count = accumarray(A(:)-min(A)+1, 1, []).';
    
  3. 在这两种情况下,count(1)min(A)的发生次数,count(2)min(A)+1,...,count(end)的发生次数是max(A)的出现次数(其中一些可能为零)。