Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 如何累计整数序列的出现次数?_Matlab_Bsxfun_Accumarray - Fatal编程技术网

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