我有一个矩阵
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))
答案 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;
。