Как накапливать количество появлений целочисленной последовательности?
У меня есть последовательность целых чисел, скажем 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
:
использование
bsxfun
проверить на равенство, а затем сложить все совпадения для каждого числа:A = [1 2 1 2 3 3 1 4 5 5 6]; count = sum(bsxfun(@eq, A(:), min(A):max(A)));
использование
accumarray
подвести1
за каждое вхождение каждого номера:count = accumarray(A(:)-min(A)+1, 1, []).';
В обоих случаях, count(1)
это число вхождений min(A)
, count(2)
это число вхождений min(A)+1
,..., count(end)
это число вхождений max(A)
(некоторые из которых могут быть нулевыми).