Pergunta

Eu tenho uma matriz 2D enorme e eu gostaria de extrair 15 diferentes 100x100 peças fora dele. Eu tenho dois vetores x e y onde o canto superior esquerdo índices das peças são guardadas. Eu tenho usado algo como isto:

result = cam1(x(1:end):(x(1:end)+99), y(1:end):(y(1:end)+99));

mas o resultado é apenas uma matriz em vez de um 15x100x100 100x100. Por quê?

Eu sei que poderia ser feito facilmente usando um loop, mas não estão autorizados a usar loops (é parte de um exercício de processamento de imagem). Outra possbility seria escrever todas as 15 linhas, mas que é tipo de feio.

Você tem alguma solução elegante? Obrigado.

Foi útil?

Solução

Há uma série de maneiras que você poderia fazer isso sem loops. A maioria das soluções envolvem a expansão dos vetores x e y para maiores matrizes de índices e provavelmente iria usar uma ou mais das funções REPMAT , BSXFUN , ou SUB2IND . Um bom tutorial para a indexação de matriz pode ser encontrada aqui .

No entanto, desde que você pediu um elegante solução, aqui está um que é um pouco incomum. Ele usa funções anônimas , bem como as funções ARRAYFUN e CAT :

indexFcn = @(r,c) cam1(r:(r+99),c:(c+99));
result = arrayfun(indexFcn,x,y,'UniformOutput',false);
result = cat(3,result{:});

EXPLICAÇÃO:

A primeira linha cria um função anônima . Esta é uma simples função de linha que podem ser criados on-the-fly, sem ter que colocá-lo em um arquivo-m. A função define duas entradas r e c que são utilizados para extrair uma submatriz 100-a-100 a partir de CAM1 . A variável indexFcn armazena um função alça , que é usado para chamar a função. Note-se que os valores de CAM1 usado pela função anônima são estática . Mesmo se os valores na variável CAM1 mudança, a função anônima ainda usa os valores que estavam em CAM1 quando a função foi criada.

A segunda linha faz uma chamada para ARRAYFUN, que aplica uma função de cada elemento de uma matriz. lacetes ARRAYFUN mais de cada entrada em x e y , passando os valores de indexFcn . A saída é armazenada em resultado , uma matriz de células de 15 elementos em que cada célula contém uma matriz de 100 por-100.

A terceira linha usa a função CAT concatenar as matrizes 100-por-100 em uma matriz de 100 por 100-by-15.

Outras dicas

Uma vez que este é, obviamente, a lição de casa, não vou dar-lhe a resposta completa.

Existem várias maneiras de índice em uma matriz. Quando você tem um conjunto de índices dispersa como este é, você precisa usar um único índice. Assim, se

A = rand(5,6)
A =
      0.81472      0.09754      0.15761      0.14189      0.65574      0.75774
      0.90579       0.2785      0.97059      0.42176     0.035712      0.74313
      0.12699      0.54688      0.95717      0.91574      0.84913      0.39223
      0.91338      0.95751      0.48538      0.79221      0.93399      0.65548
      0.63236      0.96489      0.80028      0.95949      0.67874      0.17119

A(3:4,3:4)

renderá uma submatriz 2x2 de A. Mas também podemos achar que submatrix como

reshape(A([13 14 18 19]),[2 2])
ans =
      0.95717      0.91574
      0.48538      0.79221

Por que escolhi este conjunto de índice? Para a resposta, você precisará ler sobre sub2ind.

[I,J] = ndgrid(3:4,3:4);
sub2ind([5 6],I(:),J(:))
ans =
    13
    14
    18
    19

No final, parece que você quer uma matriz 15x100x100 das partes extraídas. Então, construir a necessária variedade índice acima das peças que eu mostrei. Você vai precisar fazer uma remodelagem final no fim de fazer-lhe a forma adequada.

Este deve dar-lhe o suficiente de um início para terminar a sua lição de casa.

Você acha tudo muito a difícil, tente este: mat2cell

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top