2013-06-04 16 views
5

在MATLAB中建立索引矩陣時,我可以只指定第一個還是最後一個維度,並將所有其他維度「自動選擇」?使用冒號在未知尺寸的矩陣中建立索引

例如,我寫一個函數,它接受的圖像中,並用imshow顯示它,這既可以顯示3-d的彩色圖像(例如1024×768×3)或2- d單色陣列(例如 1024x768)。
我的功能並不在乎圖像有多少顏色通道,imshow會照顧到這一點。所有我想要做的是通過參數來選擇一個區域:

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

我把什麼來代替過去的結腸說「包括所有其他方面」?

+5

最後一個冒號不工作嗎?通常這就是'all'的Matlab語法 – Schorsch

+0

@Schorsch是正確的:[Colon operator documentation](http://www.mathworks.com/help/matlab/ref/colon.html) – Doresoom

+2

不,因爲這會使指數線性化在其餘的維度上。例如。如果框架是5維的,這將給出1維結果,而不是如預期的3維。我認爲@sebf想要保留其現有結構中的尾隨維度? –

回答

7

您可以使用逗號分隔列表擴展以及':'索引。

假設你的輸入是:

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

只提取第2:

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

要檢索的最後3:

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

哪些可以用廣義:

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

非常有用的把戲。值得指出的是,您可以擁有任意多個冒號,因爲對於任何「不存在」的尾隨維度,假定長度爲1。 –

+0

是的,一種很好的技術,謝謝奧列格! – sebf

1

從Oleg的回答可以看出,如果您從多個第一維度中進行選擇,則這個函數將起作用。如果需要其他維度,我想你可以看到如何修改。

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);