Matlab 如何累计整数序列的出现次数?
我有一个整数序列,比如说Matlab 如何累计整数序列的出现次数?,matlab,bsxfun,accumarray,Matlab,Bsxfun,Accumarray,我有一个整数序列,比如说arr=[1,5,2,2,5,1] 我需要一个结构,比如说计数器,它可以告诉我整数出现了多少次 我有以下代码,但它不起作用,因为不能以这种方式使用isfield for i = 1 : length(arr) if ~isfield(Counter, i) Counter{i} = 0; end Counter{i} = Counter{i} + 1 end 那么,有没有什么优雅的方法可以累积整数序列的出现次数呢 A = [1 2 1 2 3 3 1
arr=[1,5,2,2,5,1]
我需要一个结构,比如说计数器
,它可以告诉我整数出现了多少次
我有以下代码,但它不起作用,因为不能以这种方式使用isfield
for i = 1 : length(arr)
if ~isfield(Counter, i)
Counter{i} = 0;
end
Counter{i} = Counter{i} + 1
end
那么,有没有什么优雅的方法可以累积整数序列的出现次数呢
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
两个核心命令是和
这两个核心命令是and。除了histc之外,还有另外两种可能性:
A = [1 2 1 2 3 3 1 4 5 5 6];
count = sum(bsxfun(@eq, A(:), min(A):max(A)));
count = accumarray(A(:)-min(A)+1, 1, []).';
1
:
A = [1 2 1 2 3 3 1 4 5 5 6];
count = sum(bsxfun(@eq, A(:), min(A):max(A)));
count = accumarray(A(:)-min(A)+1, 1, []).';
在这两种情况下,
count(1)
是min(A)
的发生次数,count(2)
是min(A)+1的发生次数,…,count(end)
是max(A)
的发生次数(其中一些可能为零)。除了histc
之外,还有两种可能性:
用于测试相等性,然后对每个数字的所有一致性求和:
A = [1 2 1 2 3 3 1 4 5 5 6];
count = sum(bsxfun(@eq, A(:), min(A):max(A)));
count = accumarray(A(:)-min(A)+1, 1, []).';
用于对每个数字的每次出现求和1
:
A = [1 2 1 2 3 3 1 4 5 5 6];
count = sum(bsxfun(@eq, A(:), min(A):max(A)));
count = accumarray(A(:)-min(A)+1, 1, []).';
在这两种情况下,count(1)
是min(A)
的发生次数,count(2)
是min(A)+1的发生次数,…,count(end)
是max(A)
的发生次数(其中一些可能为零)。我最喜欢的两个函数在一个答案中。但是,如果min(A)>1
,则来自accumarray
的count(1)
将为零,而不是计数,因为它被零填充。我认为您需要执行count=accumarray(A(:),1);计数(1:min(A)-1)=[]
或类似值。如果A
可以是负数,那么它可能会变得难看,必须先使用unique
。@chappjc我知道你会喜欢这个答案,有这两个函数:-)(我也最喜欢的两个)。谢谢你富有洞察力的评论。我在一个答案中添加了-min(A)+1
到A
我最喜欢的两个函数。但是,如果min(A)>1
,则来自accumarray
的count(1)
将为零,而不是计数,因为它被零填充。我认为您需要执行count=accumarray(A(:),1);计数(1:min(A)-1)=[]
或类似值。如果A
可以是负数,那么它可能会变得难看,必须先使用unique
。@chappjc我知道你会喜欢这个答案,有这两个函数:-)(我也最喜欢的两个)。谢谢你富有洞察力的评论。我已通过将-min(A)+1
添加到A