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

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

Итак, есть ли какой-нибудь элегантный способ, который может накапливать количество вхождений целочисленной последовательности?


person SolessChong    schedule 20.12.2013    source источник


Ответы (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.

person Ray    schedule 20.12.2013

Две другие возможности, помимо 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) (некоторые из которых могут быть равны нулю).

person Luis Mendo    schedule 20.12.2013
comment
Две мои любимые функции в одном ответе. Однако, если min(A)>1, то count(1) из accumarray будет равно нулю, а не счету, потому что оно дополняется нулями. Я думаю, вам нужно сделать count = accumarray(A(:), 1).'; count(1:min(A)-1)=[] или что-то подобное. И если A может быть отрицательным, то это может стать уродливым, если сначала придется использовать unique. - person chappjc; 20.12.2013
comment
@chappjc Я знал, что вам понравится этот ответ, имея эти две функции :-) (две из моих любимых тоже). Спасибо за ваши содержательные комментарии. Я исправил, добавив -min(A)+1 к A - person Luis Mendo; 20.12.2013