MATLAB Classifique as matrizes 2D e 3D e acesse através do índice
Vamos dizer que você tem uma matriz 1D
a = rand(1,5);
[sa i] = sort(a);
entãosa
ea(i)
são os mesmos. No entanto, se o tamanho da matriz aumentar
a = rand(3,4);
[sa i] = sort(a);
entãosa
ea(i)
não são os mesmos. E o mesmo acontece quando estou tentando classificar uma matriz 3D pela terceira dimensão.
Como posso acessar os valores dea
através do índicei
? Ou, em outras palavras, como posso calcular osa=a(X)
, o queX
deveria estar
Editar
Obrigado pelas soluções. No entanto, eles não funcionam quando você altera a dimensão para classificar por. No entanto, pego a idéia e a uso para criar uma forma gera
O que o algoritmo está fazendo é criar os índices da matriz. O MATLAB indexa a coluna de células de maneira sábia. Portanto, o índice é dado por
idx = r + (c-1)*ROWS + (p-1)*ROWS*COLS
Onde,idx
é o índice,r
é a posição da linha,c
é a posição da coluna ep
é a posição da págin
Portanto, se classificarmos na primeira dimensão (normalsort(a)
) o índice do resultado é a posição nas colunas; se classificarmos na segunda dimensão, o índice do resultado será a posição nas linhas; e se classificarmos na terceira dimensão, o índice de resultados será a posição da página. Dito isto, é o último a produzir as linhas e colunas para o caso especificado:
r = repmat((1:rows)',[1 cols pages]);
c = repmat(1:cols,[rows 1 pages]);
A classificação na primeira dimensão é explicada nas soluções fornecidas. Então, vamos classificar na segunda dimensão (linha) de uma matriz bidimensional
a = rand(4,5);
[rows cols pages] = size(a);
R = repmat((1:rows)',[1 cols pages]);
[sa idx] = sort(a,2);
nIdx = R + (idx-1)*rows;
isequal(sa,a(nIdx))
gora, se usarmos a mesma idéia para classificar na terceira dimensão (página), precisamos fazer
a = rand(4,5,3);
[rows cols pages] = size(a);
R = repmat((1:rows)',[1 cols pages]);
C = repmat(1:cols,[rows 1 pages]);
[sa idx] = sort(a,3);
nIdx = R + (C-1)*rows + (idx-1)*rows*cols;
isequal(sa,a(nIdx))
E a mesma lógica pode ser usada para estendê-la a N dimensões. Obrigado pela sua ajuda, você ilumina o caminho. :)