Manipulações elementares dos quadros no MatLab

Dezembro 2016



Sumário



Armazenagem dos quadros


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)    

A indexação linear


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.

Acessar um elemento de um quadro utilizando a indexação


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 :
ALT


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    

Passar de uma indexação à outra


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
  • sub2ind permite passar da indexação linear à indexação múltipla.
  • ind2sub permite passar da indexação múltipla à indexação linear.


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.

A função ind2sub


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);
  • O primeiro argumento da função ind2sub é do tamanho do quadro elo qual se quer efetuar q conversão "indexação linear -> indexação múltipla "
  • O segundo argumento v da função ind2sub é o vetor dos índices que se pode converter.
  • O membro esquerdo [m n p] receberá os vetores correspondentes à indexação múltipla.

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.

A função sub2ind


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);
  • O primeiro argumento da função sub2ind é o tamanho do quadro pelo qual se pode efetuar a conversão "indexação múltipla -> indexação linear "
  • Os argumentos a seguir são colunas m, n, p, que contém respectivamente os índices da primeira dimensão, os índices da segunda dimensão, os índices da terceira dimensão.
  • O membro da esquerda v recebera o vetor correspondente à indexação linear.


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.

A função reshape


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

Veja também

Artigo original publicado por . Tradução feita por ninha25. Última modificação: 16 de novembro de 2011 às 08:21 por ninha25.
Este documento, intitulado ' Manipulações elementares dos quadros no MatLab', está disponível sob a licença Creative Commons. Você pode copiar e/ou modificar o conteúdo desta página com base nas condições estipuladas pela licença. Não se esqueça de creditar o CCM (br.ccm.net) ao utilizar este artigo.