Объединение двух трехколоночных матриц: уникальные значения в столбцах 1 и 2, максимум в столбце 3 - PullRequest
0 голосов
/ 23 мая 2018

У меня есть две матрицы:

a = [ 1 10 20; 2 11 22; 3 12 34; 4 13 12];
b = [ 3 12 1;  4 13 25; 5 14 60; 6 15 9 ];

Я хочу объединить их в одну матрицу, где используются строки с максимумом в столбце 3, где столбцы 1 и 2 идентичны, то есть результирующая матрица должна выглядетькак это:

 c = [ 1 10 20; 2 11 22; 3 12 34; 4 13 25; 5 14 60; 6 15 9];

Любые предложения, как это легко сделать в MATLAB, будут с благодарностью.Я ударился головой о стену, пытаясь использовать intersect, но безрезультатно.

Ответы [ 3 ]

0 голосов
/ 23 мая 2018

При объединении массивов вы должны убедиться, что они отсортированы (по col1, затем col2, затем col3).К счастью, функция union делает именно это.

В вашем примере, где значения в 1-м и 2-м столбцах всегда уникальны, мы можем только наблюдать значения в 1-м столбце, чтобы выбрать правильные строки.Это происходит, когда diff возвращает ненулевое значение (что означает, что это нижняя строка группы):

a = [ 1 10 20; 2 11 22; 3 12 34; 4 13 12];
b = [ 3 12 1;  4 13 25; 5 14 60; 6 15 9];
c = [ 1 10 20; 2 11 22; 3 12 34; 4 13 25; 5 14 60; 6 15 9 ];

u = union(a,b,'rows');               % this merges and sorts the arrays
r = u(logical([diff(u(:,1)); 1]),:); % since the array is sorted, the last entry will have 
                                     % the maximum value in column 3
assert(isequal(r,c));
0 голосов
/ 23 мая 2018

Вы также можете использовать сочетание между unique и accumarray.

  • . Используйте unique, чтобы создать индекс на основе 2 первых столбцов
  • Использовать accumarray найти максимальное значение в третьем столбце по индексу.

Код:

a = [ 1 10 20;2 11 22; 3 12 34; 4 13 12];
b = [3 12 1; 4 13 25; 5 14 60; 6 15 9];

M = [a;b];
[res,~,ind] = unique(M(:,1:2),'rows');
c  = [res,accumarray(ind,M(:,3),[],@max)]
0 голосов
/ 23 мая 2018

Читать о уникальный

a = [ 1 10 20;2 11 22; 3 12 34; 4 13 12];
b = [3 12 1; 4 13 25; 5 14 60; 6 15 9];

A = [a;b] ;
[c,ia,ib] = unique(A(:,1)) ;

C = A(ia,:)
...