Sort 3d matrix according to another 3d matrix

Hi,
I have two 3d matrices (A and B) with the same size (m,n,o).
I want to sort matrix B along the third dimension based on the sort index of matrix A:
[~, idx] = sort(A,3,'descend')
If I use the following syntax it doesn't really work:
B = B(:,:,idx)
I get a (m,n,m*n*o) matrix instead of a sorted (m,n,o) matrix.
Any ideas?

 Respuesta aceptada

Massimo Zanetti
Massimo Zanetti el 18 de Oct. de 2016
Editada: Massimo Zanetti el 18 de Oct. de 2016
According to Walter's comment, the previous solution was wrong. Here is a way to sort B given the sorted A along the 3-rd dimension:
m=3; n=4; o=2;
A=randi(9,m,n,o)
B(:,:,1)=[1,11,111,1111;2,22,222,2222;3,33,333,3333];
B(:,:,2)=[4,44,444,4444;5,55,555,5555;6,66,666,6666];
[~,ix] = sort(A,3,'descend');
[C,R,~]=meshgrid(1:n,1:m,1:o);
lix = sub2ind([m,n,o],R,C,ix);
B(lix)
Looking for a more general solution...

6 comentarios

Walter Roberson
Walter Roberson el 18 de Oct. de 2016
No, the indices are relative to the layer, not absolute.
That's it! Thank you
Massimo Zanetti
Massimo Zanetti el 18 de Oct. de 2016
Walter, you are right. Checking for solution.
A completely generic solution (ignoring potential edge cases such as A, B being vectors, etc):
function [sA, sB] = dualsort(A, B, dim, direction)
%dualsort, sort A according to dim and direction and sort B according to the order of A:
[sA, idx] = sort(A, dim, direction);
gridargs = arrayfun(@(s) 1:s, size(A), 'UniformOutput', false);
[gridargs{:}] = ndgrid(gridargs{:});
gridargs{dim} = idx;
sB = B(sub2ind(size(B), gridargs{:}));
end
Massimo Zanetti
Massimo Zanetti el 18 de Oct. de 2016
Editada: Massimo Zanetti el 18 de Oct. de 2016
That is exactly the solution I have finally run into to generalize the one above. However, it seems quite surprising that apparently there is no something like "built-in" solution...
Andrei Bobrov
Andrei Bobrov el 18 de Oct. de 2016
Editada: Andrei Bobrov el 18 de Oct. de 2016
[~, ii] = sort(A,3,'descend');
[m,n,o] = size(A);
B = B((ii-1)*m*n + reshape(1:m*n,m,[]));

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Etiquetas

Preguntada:

el 18 de Oct. de 2016

Editada:

el 18 de Oct. de 2016

Community Treasure Hunt

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

Start Hunting!

Translated by