0

我有一个矩阵

    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

4 回答 4

2

最简单的方法是使用accumarray

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

取自 Matlab 帮助:

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

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


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

  accumarray(A(:,1),zeros(size(A(:,1))),[],@numel)
于 2012-06-21T13:44:58.987 回答
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
于 2012-06-21T14:09:41.417 回答
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;在运行每个解决方案之前。

于 2012-06-23T07:44:55.180 回答
0

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

于 2012-06-21T13:42:55.757 回答