Как накапливать количество появлений целочисленной последовательности?

У меня есть последовательность целых чисел, скажем 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 ответа

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

Две основные команды unique а также histc,

Две другие возможности, в дополнение к 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, []).';
    

В обоих случаях, count(1) это число вхождений min(A), count(2) это число вхождений min(A)+1,..., count(end) это число вхождений max(A) (некоторые из которых могут быть нулевыми).

Другие вопросы по тегам