2012-11-21 12 views
8

कहो मैं अगर मैं एक समारोह संभालमैटलैब: एक समारोह संभाल एक समारोह के दूसरे दिए गए मान को पकड़ने को परिभाषित करने

f = @(c)foo(c) 

जैसे इस्तेमाल किया जा करने के लिए विचार एक समारोह के रूप में foo

[a b] = foo(c). 

परिभाषित किया गया है कि एक cellfun कॉल में, क्या मैं एक f एक foo तरह

a = foo(c) 

अर्थात परिभाषित करने के लिए समतुल्य रूप से व्यवहार कर रहा है, दिए गए मान b खो जाए।

इसलिए, जब इस तरह के एक f एक cellfun कॉल में डाल दिया जाता है, उत्पादन सेल सिर्फ a रों होगा और b रों (जो मैं वर्तमान के बारे में परवाह) को याद करेंगे। दिखने में

cellfun(f,input) 

    [a(input{1})]   ? 
    [a(input{2})]   ? 
    ....   b gets killed along the way 

प्रश्न: कैसे foo जो कैच सिर्फ b रों करने के लिए एक समारोह संभाल परिभाषित करने के लिए? अर्थात

b = foo(c) 

अर्थात^2, बर्बाद करa तरह foo की एक परिभाषा के लिए एक व्यवहार अनुरूप दे रही है।

इसके अलावा, यह संभव है (कुशलता) दोनों a और एक अद्वितीयcellfun कॉल में b पकड़ने?

उत्तर

4
से

documentation of cellfun:

[ए 1, ..., Am] = cellfun (समारोह, सी 1, ..., सीएन) समारोह समारोह संभाल समारोह द्वारा निर्दिष्ट कॉल करता है और सेल सरणियों से तत्वों से गुजरता है सी 1, ..., सीएन, जहां एन func फंक्शन करने के लिए इनपुट की संख्या है। आउटपुट सरणी ए 1, ..., एम, जहां एम फ़ंक्शन func से आउटपुट की संख्या है, फ़ंक्शन कॉल से संयुक्त आउटपुट शामिल है।

तो हाँ, cellfun एक बहु-आउटपुट फ़ंक्शन का उपयोग कर सकता है और इस मामले में यह केवल कई आउटपुट देता है। यदि आप केवल दूसरे का उपयोग करना चाहते हैं, तो आप पहले को अनदेखा करने के लिए ~ का उपयोग कर सकते हैं। अज्ञात कार्यों के कई आउटपुट के लिए यह वही होता है - यदि आप specify multiple output arguments पर वापस आ जाएंगे।

function test 
    x{1} = 1; 
    x{2} = 2; 
    [~, B] = cellfun(@foo, x); 
    [email protected](c)foo(c); 
    [A, B] = f(1); 

    function [a b] = foo(x) 
     a = x+1; 
     b = x+2; 
    end 
end 
+0

अच्छा है, यह 'सेलफुन' कॉल से संबंधित चीज़ों के लिए काम करता है; मेरे मामले में मैंने '[ए, बी]' और '' ~ ~ बी] नहीं रखा, मेरा मैटलैब संस्करण इसका समर्थन नहीं करता है। तो दूसरा बिंदु सफलतापूर्वक उत्तर दिया गया है! जहां तक ​​मैं एक लैम्ब्डा परिभाषा में दूसरा लौटा तर्क प्राप्त करने की सामान्य समस्या को देख सकता हूं, अभी भी है। यही है ना – Acorbe

+0

@Acorbe अद्यतन उत्तर देखें। यह बिल्कुल वही है - आप किसी फ़ंक्शन की घोषणा नहीं बदल सकते हैं, लेकिन आप अपने अनाम फ़ंक्शन कॉल में एकाधिक आउटपुट निर्दिष्ट कर सकते हैं। – angainor

+0

ठीक है कि मैं देखता हूं .. मैं अभी भी ऐसा कुछ ढूंढ रहा हूं जिसे '[ए, बी] = foo' सामान करने की आवश्यकता नहीं है। मुख्य रूप से retrocompatibility मुद्दों के लिए। दरअसल, किसी अन्य फ़ंक्शन (गैर फ़ंक्शन हैंडल) में फ़ंक्शन 'foo' को लपेट सकता है, हालांकि लैम्ब्डा स्वाद को खो देता है। मैनुअल के उस हिस्से को हाइलाइट करने के लिए धन्यवाद जो मैंने ध्यान से पर्याप्त रूप से नहीं पढ़ा है। – Acorbe

0

यह कई आउटपुट के साथ एक समारोह के बजाय, समारोह के एकल आउटपुट के रूप में एक सेल सरणी का उपयोग करके किया जा सकता है: यहाँ एक सरल कोड है।

एक सेल सरणी वापस जाने के लिए अपने कार्य को परिभाषित करें (या एक सहायक समारोह मूल मल्टीपल-आउटपुट फ़ंक्शन को कॉल बनाने):

function F = foo2(x) 
    [a,b,c] = foo(x); 
    F = {a, b, c}; 
end 

और फिर आप एक हैंडल अपने फ़ंक्शन को कॉल करने और केवल एक ही हो जाता है कि बना सकते हैं सेल सरणी से कोशिकाओं का।

f = @(x) cell(foo2(x)){2} % This selects the second output 
g = @(x) cell(foo2(x)){3} % This selects the third output 

जो लगभग आप वास्तव में पूछ रहे थे। आप एक हैंडल भी बना सकते हैं जो एन-वें आउटपुट

f = @(x,n) cell(foo2(x)){n} 
संबंधित मुद्दे