Sorting a matrix according to another one

4 visualizaciones (últimos 30 días)
Mattia Salomone
Mattia Salomone el 31 de Mayo de 2023
Comentada: Mattia Salomone el 1 de Jun. de 2023
Dear all,
I have the following problem to solve.
clear
clc
% A matrix defined as follows
A=[11 0.001 3
11 0.001 4
12 0.003 5
9 0.002 6
8 0.000 7
10 0.004 8
8 0.000 9
9 0.002 10];
% B matrix is the reference one
B=[8 0.000
8 0.000
9 0.002
10 0.004
9 0.002
11 0.001
11 0.001
12 0.003];
I want to sort A such that the first two columns coincide with B (and sort the other A column in agreement with this, of course). I used this code, but the problem is that since in B I have repeted conditions the result is not the one I desire.
[~,Y]=ismember(A(:,1:2),B,'rows');
[~,Z]=sort(Y);
C=A(Z,:);
% C=8 0.000 7
% 8 0.000 9
% 9 0.002 6
% 9 0.002 10
% 10 0.004 8
% 11 0.001 3
% 11 0.001 4
% 12 0.003 5
But what I want is
% C=8 0.000 7
% 8 0.000 9
% 9 0.002 6
% 10 0.004 8
% 9 0.002 10
% 11 0.001 3
% 11 0.001 4
% 12 0.003 5
Do you have any suggestions that don't involve using nested loops and if conditions?
Thank you very much for your attention!
Mattia
  2 comentarios
Torsten
Torsten el 31 de Mayo de 2023
What if B has some equal rows (like e.g. [8 0] or [11 0.001]) ?
Mattia Salomone
Mattia Salomone el 31 de Mayo de 2023
Thanks for your answer. Well in this case the order in which they appear in C should be the one they have in A. In this case with [8 0], for example, I want
[8 0 7
8 0 9]
Because in A they appear with this order.

Iniciar sesión para comentar.

Respuesta aceptada

Torsten
Torsten el 31 de Mayo de 2023
Editada: Torsten el 31 de Mayo de 2023
A = [11 0.001 3
11 0.001 4
12 0.003 5
9 0.002 6
8 0.000 7
10 0.004 8
8 0.000 9
9 0.002 10];
% B matrix is the reference one
B = [8 0.000
8 0.000
9 0.002
10 0.004
9 0.002
11 0.001
11 0.001
12 0.003];
[~,idx] = sortrows(A,[1 2]);
[~,jdx] = sortrows(B,[1 2]);
C = A(idx(jdx),:)
C = 8×3
8.0000 0 7.0000 8.0000 0 9.0000 9.0000 0.0020 6.0000 10.0000 0.0040 8.0000 9.0000 0.0020 10.0000 11.0000 0.0010 3.0000 11.0000 0.0010 4.0000 12.0000 0.0030 5.0000
  3 comentarios
Torsten
Torsten el 31 de Mayo de 2023
Editada: Torsten el 31 de Mayo de 2023
A=[11 0.001 3
11 0.001 4
12 0.003 5
9 0.002 6
8 0.000 7
10 0.004 8
8 0.000 9
9 0.002 10];
% B matrix is the reference one
B=[8 0.000
8 0.000
9 0.002
10 0.004
9 0.002
11 0.001
11 0.001
12 0.003];
Acopy = A;
C = zeros(size(A));
for i = 1:size(A,1)
idx = find(Acopy(:,1:2)==B(i,:),1);
C(i,:) = Acopy(idx,:);
Acopy(idx,:) = [];
end
C
C = 8×3
8.0000 0 7.0000 8.0000 0 9.0000 9.0000 0.0020 6.0000 10.0000 0.0040 8.0000 9.0000 0.0020 10.0000 11.0000 0.0010 3.0000 11.0000 0.0010 4.0000 12.0000 0.0030 5.0000
Mattia Salomone
Mattia Salomone el 1 de Jun. de 2023
Thank you very much for your help!

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Más información sobre Creating and Concatenating Matrices en Help Center y File Exchange.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by