2013-06-04 5 views
5

Quando si indicizzano matrici in MATLAB, è possibile specificare solo la prima o l'ultima dimensione n e tutte le altre dimensioni "selezionate automaticamente"?Utilizzo di due punti per l'indicizzazione in matrici di dimensioni sconosciute

Ad esempio, sto scrivendo una funzione che prende in un'immagine, e la visualizza con imshow, che può visualizzare immagini a colori a 3-D (es1024×768×3) o una matrice monocromatica 2-D (es 1024x768).
La mia funzione non interessa il numero di canali di colore dell'immagine, imshow si prenderà cura di ciò. Tutto quello che voglio fare è parametri passa per selezionare una singola regione:

imshow(frame(x1:x2, y1:y2, :)) 

Cosa ho messo al posto degli ultimi due punti per dire "comprendono tutte le altre dimensioni"?

+5

L'ultimo colon non funziona? Solitamente si tratta della sintassi di Matlab per "tutti" – Schorsch

+0

@Schorsch ha ragione: [Documentazione operatore colon] (http://www.mathworks.com/help/matlab/ref/colon.html) – Doresoom

+2

No, perché ciò linearizzerà gli indici attraverso le restanti dimensioni. Per esempio. se il frame è a 5 dimensioni, questo darà un risultato 1-dimensionale, al contrario di 3-dimensionale come previsto. Suppongo che @sebf voglia preservare le dimensioni finali, nella loro struttura esistente? –

risposta

7

È possibile utilizzare espansione elenco separato da virgole insieme all'indicizzazione ':'.

Supponiamo che il vostro ingresso è:

A = rand([7,4,2,3]); 

Per recuperare solo il primo 2:

cln = {':', ':'}; 
A(cln{:}) 

Per recuperare l'ultima 3:

cln = {1, ':', ':', ':'}; 
A(cln{:}) 

Che può essere generalizzata con:

sten   = 2:3; % Which dims to retrieve 
cln(1:ndims(A)) = {1}; 
cln(sten)  = {':'}; 
A(cln{:}) 
+2

Trucco molto utile. Vale la pena sottolineare che è possibile avere il numero di due punti che si desidera, poiché si presuppone che la lunghezza sia 1 per ogni dimensione finale che "non esiste". –

+0

Sì, una tecnica eccellente, grazie Oleg! – sebf

1

In seguito alla risposta di Oleg, ecco una funzione che funzionerà se si seleziona da diverse delle prime dimensioni. Se sono necessarie altre dimensioni, penso che puoi vedere come modificare.

function [dat] = getblock2(dat, varargin) 
%[dat] = getblock(dat, varargin) select subarray and retain all others 
%        unchanged 
%dat2 = getblock(dat, [1,2], [3,5]) is equivalent to 
%  dat2 = dat(1:2, 3:5, :, :, :) etc. 
%Peter Burns 4 June 2013 

arg1(1:ndims(dat)) = {':,'}; 
v = cell2mat(varargin); 
nv = length(v)/2; 
v = reshape(v,2,nv)'; 
for ii=1:nv 
    arg1{ii} = [num2str(v(ii,1)),':',num2str(v(ii,2)),',']; 
end 
arg2 = cell2mat(arg1); 
arg2 = ['dat(',arg2(1:end-1),')']; 
dat = eval(arg2);