How to match column of a one matrix with another column of second matrix?

1 view (last 30 days)
AS
AS on 28 Nov 2021
Commented: AS on 1 Dec 2021
I have three matrices like
A =
0 0 3
0 2 3
1 2 0
1 0 0
B =
0 3 0
2 3 0
2 0 1
0 0 1
C =
3 0 0
3 0 2
0 1 2
0 1 0
I want arrange matrix B and C like matrix A means column wise they all should like similar.
Could you please help me?
  4 Comments

Sign in to comment.

Accepted Answer

John D'Errico
John D'Errico on 28 Nov 2021
Edited: John D'Errico on 28 Nov 2021
A = [ 0 0 3
0 2 3
1 2 0
1 0 0];
B = [ 0 3 0
2 3 0
2 0 1
0 0 1];
C = [ 3 0 0
3 0 2
0 1 2
0 1 0];
If you will accept ONLY an exact rearrangement of the columns, then we might look for a permutation matrix. Does one exist?
PAB = (normalize(A,1,'norm',2)'*normalize(B,1,'norm',2)) > 1-10*eps
PAB = 3×3 logical array
0 0 1 1 0 0 0 1 0
If the matrix PAB is a valid permutation matrix, then it will have exactly one unit element in every row and every column. Now we can transform B using the product:
B*PAB'
ans = 4×3
0 0 3 0 2 3 1 2 0 1 0 0
If you feel you really need to get the permutation vector itself, I could do this:
[~,pab] = max(PAB,[],2)
pab = 3×1
3 1 2
B(:,pab)
ans = 4×3
0 0 3 0 2 3 1 2 0 1 0 0
Similarly,
PAC = (normalize(A,1,'norm',2)'*normalize(C,1,'norm',2)) > 1-10*eps
PAC = 3×3 logical array
0 1 0 0 0 1 1 0 0
C*PAC'
ans = 4×3
0 0 3 0 2 3 1 2 0 1 0 0
Now, suppose we have a matrix that fails to have an exact rearrangeent of the columns?
D = [ 3 0 0
0 2 3
1 2 0
1 0 0];
PAD = (normalize(A,1,'norm',2)'*normalize(D,1,'norm',2)) > 1-10*eps
PAD = 3×3 logical array
0 0 0 0 1 0 0 0 0
No such permutation of the columns exists here. A simple test of that is:
sum(PAD,1)
ans = 1×3
0 1 0
sum(PAD,2)
ans = 3×1
0 1 0
Both such tests should result in vectors of purely ones if PAD were a permutation matrix.
  3 Comments

Sign in to comment.

More Answers (0)

Community Treasure Hunt

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

Start Hunting!