Matlab:找到第一维的最大总和,按第二维分组

时间:2012-01-20 07:43:40

标签: matlab

我有一个二维矩阵A(value, label)。我想找到具有最大和第二大值总和的标签。例如:

A = (1, 1;
     2, 1;
     3, 2;
     4, 2;
     5, 3)

在这种情况下,结果应该是最大= 2,第二大= 3.我如何在MATLAB中执行此操作?

3 个答案:

答案 0 :(得分:2)

[b,m,n]=unique(a(:,2));
[val, idx]= sort(accumarray(n,a(:,1)),'descend');
b(idx(1:2))

输出是:

ans =

 2
 3

答案 1 :(得分:1)

这样的事情应该可以解决问题。

A = [1, 1; 
2, 1; 
3, 2; 
4, 2; 
5, 3];

labels = unique(A(:,2)); % Pull out unique labels

for i = 1:numel(labels)
  idx = (A(:,2) == labels(i)); % Find elements which match current label
  s(i,1) = sum(A(idx,1)); % Sum them
end

r = sortrows([s labels], -1); % Sort by decreasing sum

r(1,2); % Label corresponding to largest sum
r(2,2); % Label corresponding to second largest sum

编辑 accumarray是一个内置函数,可以为您完成此操作。虽然我发现它的文档有点神秘。

答案 2 :(得分:0)

既然你的问题不是很清楚,而且我没有得到你指的是什么,我只是想猜你是针对这样的事情

q=sortrows(A,-1);
q=q(1:2,:);

将为q中的两个标签(右列)提供最大值(左列)。

如果这不是你想要的,请发表评论。

编辑:错误读取包含标签的列,已更正