2013-02-25 59 views
5

अलग करने के लिए अगर मैं के साथ एक matlab समारोह फोन बिना, एक समारोह के लिए पैरामीटर के रूप में एक सदिश का उपयोग करना चाहते।उसके तत्वों

लेकिन अगर मैं कार्य करें: एक = [1,2,3,4,5]% (एक [1, 2, 3, 4, 5] एक ही परिणाम देता है)

तो :

समारोह (क)

मुझे देता है:

??? त्रुटि ==> 11 पर func पर्याप्त इनपुट तर्क नहीं है।

लाइन 11 func.m में है:

त्रुटि (nargchk (5, 6, nargin));

मैं ध्यान दें कि यह पूरी तरह से काम करता है:

समारोह (क (1), एक (2), एक (3), एक (4), एक (5))

मैं फ़ंक्शन के पैरामीटर के रूप में वेक्टर 'ए' का उपयोग कैसे कर सकता हूं? मेरे पास एक और फ़ंक्शन अन्यफनक (बी) है जो एक देता है, और इस आउटपुट का उपयोग इस पैरामीटर के रूप में करना चाहता है जैसे func (otherfunc (b))

+0

मैटलैब में पैरामीटर की अलग-अलग संख्या के साथ कॉलिंग फ़ंक्शन का संभावित डुप्लिकेट] (http://stackoverflow.com/questions/12741843/calling-function-with-varying-number-of-parameters-in-matlab) – user502144

उत्तर

0

बस फ़ंक्शन को एक ही तर्क दें।

function result = func(a) 
    if ~isvector(a) 
     error('Input must be a vector') 
    end 
end 
0

के बाद से मैटलैब में कार्य करने के लिए तर्क खुद को vectoes (या मैट्रिक्स) हो सकता है आप एक ही वेक्टर के साथ कई तर्क बदल नहीं सकते।
यदि func 5 तर्कों की अपेक्षा करता है, तो आप एक वेक्टर पास नहीं कर सकते हैं और मैटलैब को यह समझने की उम्मीद है कि सभी पांच तर्क वेक्टर में तत्व हैं। Matlab इस मामले के बीच अंतर कैसे बता सकता है और एक मामला जहां पहला तर्क 5-वेक्टर है?

तो, मैं इस समाधान

s.type = '()'; 
s.subs = {1:5}; 
func(subsref(num2cell(otherfunc(b)), s)) 

मुझे यकीन है कि अगर यह काम करता है नहीं कर रहा हूँ सुझाव है (मैं matlab यहाँ नहीं है), लेकिन तर्क 5-वेक्टर a (उत्पादन कन्वर्ट करने के लिए है otherfunc(b)) सेल सेल में और उसके बाद इसे func पर 5 अलग-अलग तर्कों के रूप में विस्तारित करें।
इस subsref में a{:} और a(:) के बीच अंतर न करें।

3

शायद आप नर्गिन के साथ प्रयास कर सकते हैं - एक फ़ंक्शन में एक चर जिसमें इनपुट तर्कों की संख्या का मूल्य है। चूंकि आपको अलग-अलग लंबाई इनपुट की आवश्यकता है, मुझे विश्वास है कि इसे वर्गार्जिन के साथ सबसे अच्छा संभाला जा सकता है, जिसे अंतिम इनपुट चर के रूप में सेट किया जा सकता है और फिर सभी अतिरिक्त इनपुट तर्कों को एक साथ समूहित किया जाएगा ..

function result = func(varargin) 
    if nargin == 5: % this is every element separately 
     x1 = varargin{1} 
     x2 = varargin{2} 
     x3 = varargin{3} 
     x4 = varargin{4} 
     x5 = varargin{5} 
    else if nargin == 1: % and one vectorized input 
     [x1 x2 x3 x4 x5] = varargin{1} 

मैं अपने इनपुट चर

0

के लिए x1...x5 लिखा है आप नीचे दिए गए फ़ॉर्म का एक समारोह बना सकते हैं:

function [ out ] = funeval(f, x) 
    string = 'f('; 
    for I = 1:length(x) 
     string = strcat(string, 'x(' , num2str(I), '),'); 
    end 
    string(end) = ')'; 
    out = eval(string); 
end 

जो मामले में, funeval(func, a) आवश्यक उत्पादन देता है।

0

उपयोग eval:

astr = []; 
for i=1:length(a) 
    astr  = [astr,'a(',num2str(i),'),']; % a(1),a(2),... 
end 
astr = astr(1:end-1); 
eval(['func(' astr ');']); 
5

Comma-seperated lists (सीएसएल) पैरामीटर सूची के रूप में कार्य करने के लिए पारित किया जा सकता,

तो क्या आप की जरूरत एक सरणी से निर्मित 1,2,3,4,5 के रूप में एक सीएसएल है।

यह इस तरह सेल सरणी का उपयोग कर उत्पन्न किया जा सकता:

a=[1,2,3,4,5]; 
c = num2cell(a); 
func(c{:}); 
1

एक अन्य विधि एक अलग इनलाइन समारोह बनाने के लिए किया जाएगा। एक अलग समारोह जी को परिभाषित करते हुए

f = f(x1,x2,x3) 

आप पैरामीटर मान की एक सरणी के साथ इस फोन कर सकते हैं:

g = @(x) f(x(1),x(2),x(3)) 

अब, अगर आप का एक वेक्टर है आप एक समारोह च जो कई पैरामीटर लेता है कहो पैरामीटर मान v = [1,2,3] मानते हैं, आप g (v) का उपयोग कर f (v (1), v (2), v (3)) कॉल करने में सक्षम होंगे।