Filter löschen
Filter löschen

Sorting a Matrix using Indices from another matrix !

21 Ansichten (letzte 30 Tage)
Dimitris M
Dimitris M am 13 Sep. 2013
Kommentiert: Aaron Thode am 31 Jul. 2018
Hello
I have a pretty simple question !
I have a matrix A (lets assume has a size 5 x 5) and I have another matrix of same size (5 x 5) called IDX that contains the values for sorting A in a colum-wise manner.
So how can I easily sort each column of A using matrix IDX without using a for loop or extracting each column of IDX as an individual vector ?
Thank you in advance !
  2 Kommentare
the cyclist
the cyclist am 13 Sep. 2013
This would be much easier to answer if you gave examples of the two matrices, and the expected result.
Dimitris M
Dimitris M am 13 Sep. 2013
Bearbeitet: Image Analyst am 13 Sep. 2013
Ok sure
A = [1 1 1 0 0 0;
0 0 0 1 1 1;
0 1 0 1 0 1]'
IDX = [4 5 6 3 2 1;
1 2 3 6 5 4;
6 5 4 3 2 1]'
And I want to sort A using the indices of IDX in a columnwise manner!
Is it clear enough now?

Melden Sie sich an, um zu kommentieren.

Akzeptierte Antwort

Azzi Abdelmalek
Azzi Abdelmalek am 13 Sep. 2013
[m,n]=size(A);
A=A(sub2ind([m n],idx,repmat(1:n,m,1)))
  5 Kommentare
Azzi Abdelmalek
Azzi Abdelmalek am 13 Sep. 2013
idx =[4 1 6;5 2 5;6 3 4;3 6 3;2 5 2;1 4 1];
A = [1:6;7:12;13:18]';
idx1=idx % indicate line index
4 1 6
5 2 5
6 3 4
3 6 3
2 5 2
1 4 1
[m,n]=size(A);
idx2=repmat(1:n,m,1) %indicate column index
1 2 3
1 2 3
1 2 3
1 2 3
1 2 3
1 2 3
idx=sub2ind([m n],idx1,idx2) % to get linear index
4 7 18
5 8 17
6 9 16
3 12 15
2 11 14
1 10 13
A=A(idx)
Aaron Thode
Aaron Thode am 31 Jul. 2018
Very impressive; I've wondered about this for a long time. Thank you!

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (2)

Image Analyst
Image Analyst am 13 Sep. 2013
Try this:
% Create random sample data so it will be easy
% for us to see if the sorting worked.
A = randi(9, [6,3])
IDX = [4 5 6 3 2 1;
1 2 3 6 5 4;
6 5 4 3 2 1]'
[rows, columns] = size(A)
% Sort columns of A according to the same column of IDX
for col = 1 : columns
A(:,col) = A(IDX(:,col), col);
end
% Print out to command window.
A
In the command window:
A =
7 7 7
3 8 7
9 2 3
1 5 7
4 5 6
4 6 2
IDX =
4 1 6
5 2 5
6 3 4
3 6 3
2 5 2
1 4 1
rows =
6
columns =
3
A =
1 7 2
4 8 6
4 2 7
9 6 3
3 5 7
7 5 7

Azzi Abdelmalek
Azzi Abdelmalek am 13 Sep. 2013
Bearbeitet: Azzi Abdelmalek am 13 Sep. 2013
Edit2
A = [1 1 1 0 0 0; 0 0 0 1 1 1; 0 1 0 1 0 1]'
idx= [4 5 6 3 2 1; 1 2 3 6 5 4; 6 5 4 3 2 1]'
[m,n]=size(A);
idx=bsxfun(@plus,idx,(0:m:(n-1)*m))
A=A(idx)

Kategorien

Mehr zu Shifting and Sorting Matrices finden Sie in Help Center und File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by