2011-01-25 16 views
5

मैं वर्तमान में MATLAB में सिमुलेशन कोडिंग कर रहा हूं और मुझे जो समस्या हो रही है उसके संबंध में कुछ मदद की ज़रूरत है।MATLAB: मर्जिंग फ़ंक्शन हैंडल

मैं एक समस्या है जहाँ मैं n अलग गुमनाम समारोह f_i, जिनमें से प्रत्येक सेल सरणी functions में संग्रहित है संभालती है और एक 1x1 संख्यात्मक सरणी x_i स्वीकार करता है और एक 1x1 संख्यात्मक सरणी y_i देता है पर काम कर रहा हूँ।

मैं इन गुमनाम समारोह से प्रत्येक गठबंधन करने के लिए कोशिश कर रहा हूँ एक भी गुमनाम समारोह संभाल कि एक एकल n एक्स 1 संख्यात्मक सरणी X स्वीकार करता है और एक n एक्स 1 -numeric सरणी Y रिटर्न में संभालती है। इधर, X(i) = x_i, Y(i) = y_i = f_i(x_i)

एक उदाहरण के रूप n = 2 जाने और f_1 और हो f_2 दो समारोह है कि इनपुट और आउटपुट 1x1 सरणियों संभालती है और एक सेल सरणी में जमा हो जाती है नामित कार्यों

f_1 = @(x_1) x_1^2 
f_2 = @(x_2) x_2^3 
functions = {f_1,f_2} 

मैं मूल रूप से कोड की जरूरत है कि होगा एक फंक्शन हैंडल बनाने के लिए n, f_1 और f_2 का उपयोग करने में सक्षम हो, जो 2x1 संख्यात्मक सरणी इनपुट और आउटपुट करता है।

F = @(x) [f_1(x(1,1));f_2(x(2,1))] 

उत्तर

5

यह (क्योंकि समारोह के शरीर पर आवश्यकता सीमित अभिव्यक्ति होने के लिए की) इस तरह के एक समारोह इनलाइन @() बेनामी सिंटेक्स के उपयोग को परिभाषित करना कठिन है। फिर भी एक सामान्य (गैर-अज्ञात) फ़ंक्शन को परिभाषित करना संभव है जो किसी दिए गए वेक्टर की वस्तुओं पर चलता है और किसी दिए गए सेल सरणी से उन आइटम्स पर फ़ंक्शंस लागू करता है।

function y = apply_funcs(f, x) 
    assert(length(f) == length(x)); 
    y = x; 
    for i = 1 : length(f) 
     y(i) = feval(f{i}, x(i)); 
    end 
end 

और हर बार यह कुछ अन्य एक को यह समारोह पारित करने के लिए सिर्फ अपनी @ -handle को संदर्भ के लिए आवश्यक है।

F = @apply_funcs 
+0

इस के लिए धन्यवाद:

और यहाँ कुछ परीक्षण मामलों रहे हैं! मुझे कोड को यथासंभव कुशल होने की आवश्यकता है, इसलिए मैं शायद आपके फ़ंक्शन का उपयोग करूंगा और लंबाई/जोर देने वाले तर्कों को हटा दूंगा ... साथ ही, क्या आपको यह पता चल जाएगा कि इनलाइन फ़ंक्शन हैंडल मूल्यांकन का उपयोग करने से feval तेज है या नहीं?यह कहना है, y (i) = f {i} (x (i)) y (i) = feval (f {i}, x (i)) से अधिक तेज़ हो)> –

2

यह a solution I provided to a similar previous question का उपयोग कर हल किया जा सकता, यद्यपि वहाँ कुछ कैसे आप इनपुट तर्क से प्रारूप के बारे में अंतर होगा। आप प्राप्त कर सकते हैं कि आप क्या काम करता है CELLFUN और FEVAL का उपयोग कर करना चाहते हैं एक पंक्ति में अपने अनाम प्रक्रियाएं मूल्यांकन करने के लिए, और समारोह NUM2CELL एक सेल सरणी CELLFUN द्वारा प्रयोग की जाने के लिए अपने इनपुट वेक्टर परिवर्तित करने के लिए:

f_1 = @(x_1) x_1^2;  %# First anonymous function 
f_2 = @(x_2) x_2^3;  %# Second anonymous function 
fcnArray = {f_1; f_2}; %# Cell array of function handles 
F = @(x) cellfun(@feval,fcnArray(:),num2cell(x(:))); 

ध्यान दें कि मैं फ़ंक्शन हैंडल की सेल सरणी के लिए fcnArray नाम का उपयोग किया गया है, क्योंकि functions नाम पहले से ही अंतर्निहित फ़ंक्शन FUNCTIONS के लिए उपयोग किया जाता है। colon operator (:) का उपयोग fcnArray और इनपुट तर्क x को कॉलम वैक्टर में बदलने के लिए किया जाता है यदि वे पहले से नहीं हैं। यह सुनिश्चित करता है कि आउटपुट एक कॉलम वेक्टर है।

>> F([2;2]) 

ans = 

    4 
    8 

>> F([1;3]) 

ans = 

    1 
    27 
+0

इसके लिए धन्यवाद। आपका दृष्टिकोण निश्चित रूप से अधिक विचित्र है, हालांकि मैं सोच रहा हूं कि यह आईआईबी द्वारा वर्णित लूप के मुकाबले तेज प्रदर्शन करेगा या नहीं? –

+0

k मैं दोनों कोशिश करूँगा और देखें कि कौन सा बेहतर है - क्या आप किसी प्रकार के संसाधन के बारे में जानते हैं जो सर्वोत्तम MATLAB प्रथाओं को दिखाता है? मैं हमेशा अपने कोड को यथासंभव कुशल बनाने की कोशिश कर रहा हूं, हालांकि MATLAB पर इनबिल्ट फ़ंक्शंस के साथ इन चीजों को करने के लिए अक्सर 3-4 तरीके हैं, मुझे मुश्किल है कि यह पता लगाना मुश्किल है कि क्या महंगा है और क्या नहीं है । –