6

यदि मेरे पास एक सरणी है (रनटाइम तक अज्ञात लंबाई का), क्या एक अलग पैरामीटर के रूप में सरणी के प्रत्येक तत्व के साथ फ़ंक्शन को कॉल करने का कोई तरीका है?Matlab में एक splat ऑपरेटर (या समतुल्य) है?

तो जैसा

:

foo = @(varargin) sum(cell2mat(varargin)); 
bar = [3,4,5]; 
foo(*bar) == foo(3,4,5) 

प्रसंग: मैं एक n -d सरणी, Q के सूचकांकों की एक सूची है। मुझे जो चाहिए वह Q(a,b,:) जैसा है, लेकिन मेरे पास केवल [a,b] है। चूंकि मुझे n नहीं पता है, इसलिए मैं इंडेक्सिंग को हार्ड-कोड नहीं कर सकता।

उत्तर

7

MATLAB में कोई ऑपरेटर नहीं है जो ऐसा करेगा। हालांकि, अगर आपके सूचकांक (अपने उदाहरण में अर्थात bar) एक cell array में संग्रहीत किया गया है, तो आप ऐसा कर सकते हैं:

bar = {3,4,5}; %# Cell array instead of standard array 
foo(bar{:});  %# Pass the contents of each cell as a separate argument 

{:} एक सेल सरणी से एक comma-separated list पैदा करता है। existing operators (सचित्र here और here) में से एक को ओवरराइड करने के अलावा, आपके पास "ऑपरेटर" फ़ॉर्म में संभवतः सबसे नज़दीकी चीज हो सकती है, जो कि एक मानक सरणी से अल्पविराम से अलग सूची उत्पन्न करती है, या आपके अपने सूचकांक को स्टोर करने के लिए अपनी कक्षा और परिभाषित करना कि मौजूदा ऑपरेटर इसके लिए कैसे काम करते हैं (न ही दिल की बेहोशी के लिए विकल्प!)।

एक मनमाना एन डी सरणी को सूचीबद्ध करने में अपने विशिष्ट उदाहरण के लिए, आप भी sub2ind समारोह का उपयोग कर (विस्तृत here और here रूप में) अपने subscripted सूचकांक से एक रेखीय सूचकांक की गणना सकता है, लेकिन आप के लिए होगा और अधिक से अधिक काम कर रही अंत हो सकता है ऊपर मेरे अल्पविराम से अलग सूची समाधान। एक और विकल्प compute the linear index yourself है, जो converting to a cell array से बाहर निकल जाएगा और केवल मैट्रिक्स/वेक्टर ऑपरेशंस का उपयोग करेगा। यहां एक उदाहरण दिया गया है:

% Precompute these somewhere: 
scale = cumprod(size(Q)).'; %' 
scale = [1; scale(1:end-1)]; 
shift = [0 ones(1, ndims(Q)-1)]; 

% Then compute a linear index like this: 
indices = [3 4 5]; 
linearIndex = (indices-shift)*scale; 
Q(linearIndex) % Equivalent to Q(3,4,5) 
संबंधित मुद्दे