MatLab armazena os vetores, as matrizes, e mais geralmente os quadros, quaisquer que seja, suas dimensões, na forma de vetores colunas.
Por exemplo, a seguinte matriz:
(2 7 4) (5 8 3)
E estocada no vetor obtido colocando a ponta a ponta suas colunas
(2) (5) (7) (8) (4) (3)
Esta maneira de estocar no MatLab, implica particularmente que se pode acessar os elementos de um quadro através de um só índice (variante 1 no número total do quadro), é o que se chama a indexação linear.
Para as matrizes, nós vamos ver que o vetor coluna que lhe correspondia era simplesmente colunas da matriz colocadas ponto a ponto. No entanto, é difícil ver o que se passa durante a manipulação dos quadros com mais de 2 dimensões.
Vamos considerar o caso particular de um quadro T com 3 dimensões, de tamanho 4x2x3. O quadro contém 24 elementos. Então, por numeração de 1 a 24 e considerando (para maior clareza) que um quadro em três dimensões é um conjunto de páginas (a última dimensão), contendo cada uma das matrizes (as duas primeiras dimensões), esta é a forma como eles estão organizados;
Estes elementos são organizados no vetor coluna correspondente ao Quadro incrementando o primeiro índice do Quadro, em seguida, o segundo e o terceiro (e as seguintes, se nós trabalhamos com mais de três dimensões).
Especificamente, aqui está como você pode exibir os elementos de T na ordem de armazenamento. Primeiro, atribua um valor para T:
T=rand(4,2,3);
No vetor coluna que lhe corresponde, os elementos são dados na sua ordem de armazenagem por:
for p=1:3 for n=1:2 for m=1:4 disp(T(m,n,p)); end end end
Dito de uma maneira diferente, partindo do vetor coluna correspondente armazenagem de um quadro, este "guardado" no quadro ao cortá-lo de acordo com a última dimensão, depois a precedente e assim por diante. O corte é feito, então, desta maneira :
Finalmente, pelo nosso exemplo, pode-se acessar ao décimo primeiro elemento do quadro T de duas maneiras:
T(3,1,2)
ou
T(11)
Basta digitar as poucas linhas seguintes que aparecem na mesma ordem que com as 3 círculos imbricados anteriormente :
for q=1:24 disp(T(q)); end
De acordo com os casos, uma ou outra indexação pode ser mais prática. Existe funções MatLab que simplificam a manipulação destas indexações : i
Uma ajuda sobre a utilização destas funções é possível a partir da janela MatLab digitando help sub2ind ou help ind2sub. Para acessar à uma ajuda mais detalhada, digite doc sub2ind ou doc ind2sub.
Peguemos uma explicação de um caso particular.
Pra conhecer a indexação múltipla correspondente aos índices 3, 8, 17, 23 de um quadro de tamanho 4x2x3 basta fazer:
v=[3;8;17;23]; [m n p]=ind2sub([4 2 3],v);
Mais precisamente, para o quadro T de tamanho 4x2x3 nós teremos:
T(m(1),n(1),p(1))=T(v(1))=T(3)
T(m(2),n(2),p(2))=T(v(2))=T(8)
T(m(3),n(3),p(3))=T(v(3))=T(17)
T(m(4),n(4),p(4))=T(v(4))=T(23)
Você pode então testar estas poucas:
T=rand(4,2,3); v=[3;8;17;23]; [m n p]=ind2sub([4 2 3],v); for q=1:4 disp([T(m(q),n(q),p(q)), T(v(q))]); end
para ver que nós obtivemos o bom resultado.
Supor-se-á que se queira converter em indexação linear os múltiplos índices (2,2,1), (1,2,3), (4,1,2), (3,1,3) de um quadro de tamanho 4x2x3,basta então fazer:
m=[2;1;4;3]; n=[2;2;1;1]; p=[1;3;2;3]; v=sub2ind([4 2 3],m,n,p);
Mais precisamente, para qualquer quadro T de tamanho 4x2x3 nós teremos:
T(v(1))=T(m(1),n(1),p(1))=T(2,1,1)
T(v(2))=T(m(2),n(2),p(2))=T(1,2,3)
T(v(3))=T(m(3),n(3),p(3))=T(4,1,2)
T(v(4))=T(m(4),n(4),p(4))=T(3,1,3)
Você pode então testar estas poucas linhas:
T=rand(4,2,3); m=[2;1;4;3]; n=[2;2;1;1]; p=[1;3;2;3]; v=sub2ind([4 2 3],m,n,p); for q=1:4 disp([T(v(q)), T(m(q),n(q),p(q))]); end
para ver que nós obtivemos o bom resultado.
Considerando a armazenagem de um quadro no MatLab, compreende facilmente que o tamanho de um quadro não é tão importante e que basta de uma pequena função para dar à um quadro a forma que se quer (considerando que o número de elementos não mude). A função MatLab que permite redimensionar um quadro é reshape.
Como para as outras funções, uma ajuda referente à esta função é acessível a partir da janela MatLab digitando help reshape ou então doc reshape para uma ajuda mais detalhada.
Para compreender a ação da instrução reshape, basta saber que redirecionar um quadro M os elementos de T são tomados na ordem crescente de sua indexação e "colocados" na M com a mesma ordem.
Tomemos novamente o exemplo do quadro T precedente (T é de tamanho 4x2x3). Como já foi dito, o número de elementos deste quadro é 24. vê que é também o número de elementos de uma matriz M de tamanho 6x4. Eis o que se passa, pois quando se digita o código seguinte:
M=reshape(T,[6 4]);
Observa-se que se pode facilmente obter o quadro inicial T com a ajuda de M redimensionando como for preciso:
TT=reshape(M,[4 2 3]);
O quadro TT é então idêntico ao quadro T inicial.
Tradução feita por Ana Spadari