Sorting and indexing multidimensional arrays

8 visualizaciones (últimos 30 días)
Shing Bo Peh
Shing Bo Peh el 12 de Nov. de 2020
Editada: Shing Bo Peh el 12 de Nov. de 2020
I would like to clarify if indexing is supported for multidimensional arrays.
For example, consider the code below.
According to the help page, the line B2 = A(I) a recover the sorted array.
However, from MATLAB Online R2020b the code snippet produces array full of ones as the result for B2.
A(:,:,1) = 1*ones(3);
A(:,:,2) = 2*ones(3);
A(:,:,3) = 3*ones(3);
A(:,:,4) = 4*ones(3);
[B,I] = sort(A,3,'descend');
B2 = A(I);
  2 comentarios
Stephen23
Stephen23 el 12 de Nov. de 2020
"According to the help page, the line B2 = A(I) a recover the sorted array."
What the sort documentation actually states is "if A is a vector, then B = A(I)" (emphasis added).
Are your data in a vector? (hint: no).
Shing Bo Peh
Shing Bo Peh el 12 de Nov. de 2020
Thanks for the explanation, indeed A is not a vector. Your comment and Walter's answer have been helpful in extending the example to 3D arrays.

Iniciar sesión para comentar.

Respuesta aceptada

Walter Roberson
Walter Roberson el 12 de Nov. de 2020
See https://www.mathworks.com/matlabcentral/answers/645463-help-required-for-sorting#answer_542268 -- I just happened to write up an explanation for someone of the same basic problem.
You would need to expand what I wrote there into the third dimension. You would want to change the repmat() that I show there into something more like
[ROWIDX, COLIDX] = ndgrid(1:size(A,1), 1:size(A,2));
B2 = sub2ind(size(A), ROWIDX, COLIDX, sortidx);
This is untested; you might need to use meshgrid() instead of ndgrid()
  3 comentarios
Walter Roberson
Walter Roberson el 12 de Nov. de 2020
Thanks for the test case, Bruno!
Shing Bo Peh
Shing Bo Peh el 12 de Nov. de 2020
Confirmed, thank you Bruno.

Iniciar sesión para comentar.

Más respuestas (1)

Bruno Luong
Bruno Luong el 12 de Nov. de 2020
Editada: Bruno Luong el 12 de Nov. de 2020
[B,I] = sort(A,3,'descend');
I is ndarray same size as A and B, values is 1:size(A,3) such that for any i,j
A(i,j,I(i,j,:))
is equal to
B(i,j,:)
(Both are then sorted in descending order)

Categorías

Más información sobre Shifting and Sorting 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