J'ai deux matrices:

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 ];

Je veux les fusionner en une seule matrice où les lignes avec le maximum dans la colonne 3 sont utilisées où les colonnes 1 et 2 sont identiques, c'est-à-dire que la matrice résultante devrait ressembler à ceci:

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

Toute suggestion sur la façon de procéder facilement dans MATLAB serait grandement appréciée. Je me suis cogné la tête contre un mur en essayant d'utiliser intersect mais en vain.

0
Tomm 23 mai 2018 à 09:26

3 réponses

Meilleure réponse

Lors de la fusion des tableaux, vous devez vous assurer qu'ils finissent par être triés (par col1 puis col2 puis col3). Heureusement, la fonction union fait exactement cela.

Dans votre exemple, où les valeurs des 1ère et 2ème colonnes sont toujours uniques, nous ne pouvons observer que les valeurs de la 1ère colonne pour choisir les bonnes lignes. Cela se produit lorsque diff renvoie une valeur différente de zéro (ce qui signifie que c'est la ligne du bas d'un groupe):

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
Dev-iL 23 mai 2018 à 07:40

Vous pouvez également utiliser un mélange entre unique et accumarray.

  • Utilisez unique pour créer un index basé sur les 2 premières colonnes
  • Utilisez accumarray pour trouver la valeur maximale dans la troisième colonne en fonction de l'index.

Le code:

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
obchardon 23 mai 2018 à 08:18

En savoir plus sur unique

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,:)
-1
Siva Srinivas Kolukula 23 mai 2018 à 06:37