Dal blockproc
(e deprecato blkproc
) sono entrambe le funzioni nella Image Processing Toolbox, ho pensato di aggiungere una soluzione di MATLAB di base che non richiede ulteriori cassette ...
Se si desidera dividere un matrice in sottomatrici, un modo è quello di utilizzare mat2cell
per interrompere la matrice e memorizzare ogni sottotitolo in una cella di un array di celle. Per il caso, la sintassi sarà simile questo:
C = mat2cell(I, [128 128], [128 128]);
C
è ora una matrice di celle 2-by-2 con ciascuna cella memorizza un sottomatrice 128-by-128 di I
. Se si desidera eseguire un'operazione su ciascuna cella, è possibile utilizzare la funzione cellfun
. Ad esempio, se si voleva prendere la media dei valori in ogni sottomatrice, si dovrebbe effettuare le seguenti operazioni:
meanValues = cellfun(@(x) mean(x(:)), C);
Il primo argomento è un function handle a un anonymous function che prima rimodella ogni sottomatrice in un vettore colonna e poi prende la media. L'output è una matrice 2 per 2 dei valori medi per ogni submatrix.Se la funzione si passa alla cellfun
crea uscite di diverse dimensioni o tipi per ogni cella, quindi cellfun
avrà un problema loro concatenazione e genera un errore:
??? Error using ==> cellfun
Non-scalar in Uniform output, at index 1, output 1.
Set 'UniformOutput' to false.
Se si aggiunge ..., 'UniformOutput', false);
alla fine del tuo invito cellfun
, quindi l'output nel caso precedente sarà invece un array di celle 2-by-2 contenente i risultati dell'esecuzione dell'operazione su ciascuna sottomatrice.
Se si sta ancora utilizzando una versione precedente di Image Processing Toolbox con la funzione BLKPROC, la sintassi dell'esempio precedente cambierà in: 'B = blkproc (I, [8 8], @ (x) significa (x (:))); ' – gnovice