Domanda

Ho una matrice 2D enorme e vorrei estrarre 15 diversi 100x100 parti fuori di esso. Ho due vettori xey in cui vengono salvati gli indici superiore sinistro della parti. Ho usato qualcosa di simile:

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

, ma il risultato è solo una matrice di 100x100 invece di un 15x100x100. Perché?

Lo so che potrebbe facilmente essere fatto utilizzando un ciclo, ma non sono autorizzati a utilizzare i loop (è parte di un esercizio di elaborazione delle immagini). Un altro possbility sarebbe quello di scrivere tutte le 15 linee, ma che è una specie di brutto.

Avete qualche soluzione elegante? Grazie.

È stato utile?

Soluzione

Ci sono un certo numero di modi che si potrebbe fare questo senza loop. Molte soluzioni coinvolgere espansione vettori x e y in grandi matrici di indici e sarebbe probabilmente utilizzare una o più delle funzioni REPMAT , BSXFUN o SUB2IND . Un buon tutorial per matrice indicizzazione può essere trovato qui .

Tuttavia, dal momento che lei ha chiesto per un elegante soluzione , ecco uno che è un po 'insolita. Esso utilizza funzioni anonime così come le funzioni ARRAYFUN e CAT :

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

SPIEGAZIONE:

La prima riga crea una funzione anonima . Si tratta di una semplice funzione di linea che può essere creato on-the-fly, senza dover mettere in un m-file. La funzione definisce due ingressi r e c che vengono utilizzati per estrarre una sottomatrice 100-by-100 da cam1 . La variabile indexFcn memorizza una maniglia funzione rel="noreferrer"> che viene utilizzato per richiamare la funzione. Si noti che i valori di cam1 utilizzata dalla funzione anonima sono static . Anche se i valori nella variabile cam1 il cambiamento, la funzione anonima utilizza ancora i valori che erano in cam1 al momento della creazione della funzione.

La seconda linea effettua una chiamata a ARRAYFUN, che applica una funzione per ogni elemento di un array. ARRAYFUN loop su ogni voce in x e y , passando i valori di indexFcn . L'uscita viene memorizzata in risultato , una matrice di celle 15 elementi in cui ogni cella contiene una matrice 100-by-100.

La terza riga utilizza la funzione CAT per concatenare le matrici 100-by-100 in una matrice 100-by-100-by-15.

Altri suggerimenti

Dal momento che questo è, ovviamente, compiti a casa, io non ti do la risposta completa.

Ci sono diversi modi per indicizzare una matrice. Quando si dispone di un set di indice sparsi in quanto si tratta, è necessario utilizzare un unico indice. Così, 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)

produrrà una sottomatrice 2x2 da A. Ma possiamo anche scoprire che sottomatrice come

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

Perché ho scelto questo set index? Per la risposta, è necessario leggere su sub2ind.

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

Alla fine, sembra che si desidera un array di 15x100x100 dalle parti estratte. Così costruire l'array di indici necessari fino dai pezzi che ho mostrato. Avrete bisogno di fare un rimodellare finale al termine di rendere la forma corretta.

Questo dovrebbe dare abbastanza di un dall'inizio alla fine i compiti a casa.

Pensi che tutto lontano per difficili, provate questo: mat2cell

scroll top