2013-06-04 10 views
5

Podczas indeksowania macierzy w programie MATLAB, czy mogę podać tylko pierwszy lub ostatni rozmiar wymiarów i czy wszystkie pozostałe wymiary "wybrane automatycznie"?Używanie dwukropka do indeksowania w macierzach o nieznanych wymiarach

Na przykład, m pisania funkcję, która zaczyna się w obrazie i wyświetla go imshow, który może wyświetlać 3-D kolorowy obraz (np1024×768×3) lub 2-D monochromatycznego tablicę (np 1024 x 768).
Moja funkcja nie dba o to, ile kanałów kolorów ma obraz, imshow zajmie się tym. Wszystko co chcę zrobić, to parametry podaje do wybrać pojedynczy region:

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

Co mogę umieścić w miejscu ostatniego okrężnicy powiedzieć „obejmują wszystkich innych wymiarów”?

+5

Czy ostatnia okrężnica nie działa? Zwykle jest to składnia Matlaba dla "wszystkich" – Schorsch

+0

@Schorsch ma rację: [Dokumentacja operatora Colon] (http://www.mathworks.com/help/matlab/ref/colon.html) – Doresoom

+2

Nie, ponieważ to spowoduje linearyzację indeksów w pozostałych wymiarach. Na przykład. jeśli ramka jest 5-wymiarowa, da to wynik 1-wymiarowy, w przeciwieństwie do 3-wymiarowego zgodnie z oczekiwaniami. Zakładam, że @sebf chce zachować końcowe wymiary w ich istniejącej strukturze? –

Odpowiedz

7

Możesz użyć rozwinięcie listy rozdzielanej przecinkami wraz z indeksowaniem ':'.

Przypuśćmy Twój wkład jest:

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

Aby pobrać tylko pierwsze 2:

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

Aby pobrać ostatnie 3:

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

które mogą być uogólnione z:

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

Bardzo przydatna sztuczka. Warto zauważyć, że możesz mieć tyle kolumn, ile chcesz, ponieważ zakłada się, że długość wynosi 1 dla wymiarów, które "nie istnieją". –

+0

Tak, doskonała technika, dziękuję Oleg! – sebf

1

Po odpowiedzi Olega, oto funkcja, która zadziała, jeśli wybierzesz spośród kilku pierwszych wymiarów. Jeśli potrzebne są inne wymiary, myślę, że możesz zobaczyć, jak je modyfikować.

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); 
Powiązane problemy