2013-06-04 2 views
5

MATLAB में मैट्रिक्स को अनुक्रमणित करते समय, क्या मैं केवल पहले या अंतिम n आयाम निर्दिष्ट कर सकता हूं, और अन्य सभी आयाम "स्वचालित रूप से चुने गए" हैं?अज्ञात आयामों के मैट्रिक्स में अनुक्रमण के लिए एक कोलन का उपयोग

उदाहरण के लिए, मैं एक समारोह जो एक छवि में लेता है, और imshow साथ यह प्रदर्शित करता है, जो एक 3 डी रंग छवि प्रदर्शित कर सकते या तो (1024×768×3जैसे) या 2-डी मोनोक्रोम सरणी (जैसे लिख रहा हूँ 1024x768)।
मेरा फ़ंक्शन इस बात पर परवाह नहीं करता कि छवि के कितने रंग चैनल हैं, imshow इसका ख्याल रखेगा।

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

क्या मैं पिछले बृहदान्त्र के स्थान पर रखा कहते हैं "अन्य सभी आयामों में शामिल हैं" है: सभी मैं करना चाहता हूँ पास मापदंडों एक भी क्षेत्र का चयन करने के लिए है?

+5

क्या अंतिम कॉलन काम नहीं करता है? आम तौर पर 'सभी' – Schorsch

+0

@Schorsch के लिए मैटलैब सिंटैक्स सही है: [कॉलन ऑपरेटर प्रलेखन] (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

ओलेग के उत्तर के बाद, यहां एक ऐसा कार्य है जो काम करेगा यदि आप पहले आयामों में से कई का चयन कर रहे हैं। यदि अन्य आयामों की आवश्यकता है, तो मुझे लगता है कि आप संशोधित करने के तरीके को देख सकते हैं।

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); 
संबंधित मुद्दे