Matlab: поиск наибольшей суммы первого измерения, группировка по второму измерению - PullRequest
0 голосов
/ 20 января 2012

У меня есть двумерная матрица A(value, label). Я хочу найти метку с наибольшей и второй по величине суммой значений. Например:

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

В этом случае результат должен быть самым большим = 2, вторым по величине = 3. Как это сделать в MATLAB?

Ответы [ 3 ]

2 голосов
/ 20 января 2012
[b,m,n]=unique(a(:,2));
[val, idx]= sort(accumarray(n,a(:,1)),'descend');
b(idx(1:2))

Вывод:

ans =

 2
 3
1 голос
/ 20 января 2012

Примерно так и должно быть.

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

EDIT accumarray - это встроенная функция, которая сделает это за вас.Хотя я нахожу документацию по этому вопросу несколько загадочной.

0 голосов
/ 20 января 2012

Поскольку ваш вопрос не очень ясен, и я не понимаю, какую сумму вы имеете в виду, я просто догадываюсь, что вы стремитесь к чему-то подобному

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

, который даст две метки (правый столбец) с самыми большими значениями (левый столбец) в q.

Если это не то, что вы искали, пожалуйста, прокомментируйте.

РЕДАКТИРОВАТЬ: Пропущено, какой столбец, содержащий метки, исправлено

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...