找到两列矩阵中的元素数

时间:2012-06-21 13:37:36

标签: matlab matrix

我有一个矩阵

    1        2
    1        3
    1        4
    2        1
    2        4
    3        1

我需要结果矩阵只包含

    1        3 (number of elements that related to element 1 (2,3,4))
    2        2 (number of elements that related to element 2 (1,4))
    3        1 (number of elements that related to element 3 (1))

4 个答案:

答案 0 :(得分:2)

最简单的方法是使用accumarray

  accumarray(A(:,1),A(:,2),[],@numel);

取自Matlab帮助:

  

accumarray对数据集中的元素进行分组,并将函数应用于每个组。 A = accumarray(subs,val)通过使用subs的元素作为索引来累积向量val的元素来创建数组A. subs中元素的位置确定它为累积向量选择的val值; subs中元素的值决定了输出中累积向量的位置。

在我们的案例中,我们需要对所有元素进行分组并计算其数量。 numel进行计数。


顺便说一句,您根本不需要第二列数据:

  accumarray(A(:,1),zeros(size(A(:,1))),[],@numel)

答案 1 :(得分:0)

使用find(a(:,1)==1)查找第一列值为1的行号

答案 2 :(得分:0)

这是使用数组索引和唯一生成计数的另一种方法:

%demo array
a=[1 1 1 2 2 3]';
%get unique elements
b=unique(a);
%count and put into matrix
result=[b sum((a(:,ones(1,length(b))))'==b(:,ones(1,length(a))),2)];

result =

     1     3
     2     2
     3     1

答案 3 :(得分:0)

您可以使用统计工具箱中的制表功能:

>> tabulate(A(:,1))
  Value    Count   Percent
      1        3     50.00%
      2        2     33.33%
      3        1     16.67%

使用HISTC的另一种解决方案:

vals = unique(A(:,1));
counts = histc(A(:,1), vals);

结果矩阵:

>> result = [vals counts]
result =
    1     3
    2     2
    3     1

这与ACCUMARRAY / TABULATE的不同之处在于它不假设元素从1开始。要了解我的意思,请在运行每个解决方案之前将A修改为:A(:,1) = A(:,1)+10;