2013-08-12 6 views
8

प्रश्न: मैटलैब में, मैं कैसे जांच सकता हूं कि फ़ंक्शन हैंडल एक विशेष फ़ंक्शन या फ़ंक्शन प्रकार है या नहीं?Matlab - जांचें कि फ़ंक्शन हैंडल एक विशेष फ़ंक्शन या फ़ंक्शन प्रकार

उदाहरण:f1 एक फ़ंक्शन हैंडल बनें। मैं कैसे जांचूं कि f1 अंतर्निहित मैटलैब फ़ंक्शन mean है? मैं कैसे जांचूं कि f1 एक अनाम कार्य है?

मेरा वर्तमान समाधान: इस समस्या के मेरे वर्तमान समाधान में functions फ़ंक्शन पर कॉल शामिल है। functions इनपुट के रूप में एक समारोह संभाल स्वीकार करता है और एक संरचना इनपुट समारोह संभाल, जैसे समारोह का प्रकार, पथ कार्यप्रणाली के नाम आदि यह काम करता है के बारे में जानकारी युक्त देता है, लेकिन यह एक आदर्श समाधान क्योंकि, official documentation उद्धृत करने के लिए नहीं है:

"सावधानी MATLAB® केवल पूछताछ और डिबगिंग उद्देश्यों के लिए functions फ़ंक्शन प्रदान करता है। क्योंकि इसके व्यवहार बाद के रिलीज़ में बदल सकते हैं, आपको प्रोग्रामिंग उद्देश्यों के लिए इसका भरोसा नहीं करना चाहिए।"

+0

यह एक है सार में वैध सवाल है, लेकिन मुझे आश्चर्य है कि आपको ऐसा करने की आवश्यकता क्यों है? इस सवाल के पीछे क्या बड़ी बात है कि आप क्या करने की कोशिश कर रहे हैं? –

+0

@ सैम रॉबर्ट्स एक ऐसे फ़ंक्शन के भीतर जो 'एफ 1' को अपने इनपुट में से एक के रूप में स्वीकार करता है, मैं कुछ शॉर्ट-कट लेने में सक्षम हूं यदि' एफ 1 'नमूना माध्य आदि जैसे कई मान्यता प्राप्त कार्यों में से एक है। हालांकि, मैं भी चाहते हैं कि फ़ंक्शन अन्य प्रकार के कार्यों 'f1' के लिए काम करे, जहां ऐसे शॉर्ट-कट असंभव हैं। इसका कोई मतलब भी है क्या? –

+2

कॉलिन, आप इस लेख के माध्यम से पढ़ सकते हैं, विशेष रूप से दो टिप्पणियां (एक उद्धृत, वास्तविक टिप्पणियों में से एक) मैथवर्क्स 'लॉरेन शूर से: http://undocumentedmatlab.com/blog/cellfun-undocumented-performance-boost/ यह इंगित करेगा कि 'सेलफुन' जैसे कुछ बिल्टिन फ़ंक्शंस आपके जैसा ही समस्या का सामना करते हैं, और दोनों फ़ंक्शन हैंडल और स्ट्रिंग तर्कों का सीमित सेट उसी स्थान पर अनुमति देते हुए समस्या को हल करते हैं, प्रीसेट के लिए वैकल्पिक और तेज़ कोड पथ प्रदान करते हैं तार। सिर्फ एक विचार। –

उत्तर

11

func2str का उपयोग करने के बारे में कैसे?

यदि यह एक इनबिल्ट फ़ंक्शन है, तो उसे फ़ंक्शन नाम वाले स्ट्रिंग को वापस करना चाहिए; अगर यह एक अज्ञात फ़ंक्शन है तो उसे अनाम फ़ंक्शन (@ सहित) वापस करना चाहिए।

h1 = @(x) x.^2; 
h2 = @mean; 
str1 = func2str(h1); %str1 = "@(x) x.^2" 
str2 = func2str(h2); %str2 = "mean" 

तुम भी दो समारोह हैंडल तुलना करने के लिए उपयोग कर सकते हैं isequal (ईटीए: इस दो अनाम प्रक्रियाएं तुलना करने के लिए काम नहीं करेगा जब तक कि एक अन्य की एक प्रति के रूप में बनाया गया था):

isequal(h1,@mean); % returns 0 
isequal(h2,@mean); % returns 1 
+0

+1 बिल्कुल वही जो मैं खोज रहा था। बहुत धन्यवाद। –

+5

आपको इसके साथ सावधान रहना होगा - यदि पथ बदल रहा है तो यह काम नहीं करेगा। उदाहरण के लिए: पथ पर उपयोगकर्ता द्वारा परिभाषित फ़ंक्शन 'माध्य' बनाएं। 'F = @ mean' के साथ इसे एक हैंडल बनाएं। उपयोगकर्ता द्वारा परिभाषित फ़ंक्शन हटाएं। अंतर्निहित 'माध्य' को 'g = @ mean' के साथ एक हैंडल बनाएं। अब 'func2str (f)' और 'func2str (g)' दोनों वापसी 'माध्य'। इसके अलावा (यह मेरे लिए एक बग जैसा लगता है) 'असमान (एफ, जी)' रिटर्न 'सत्य'। लेकिन वे अलग-अलग चीजें हैं, और 'f' अब त्रुटि होगी क्योंकि फ़ाइल पहुंच योग्य नहीं है। यदि आपको पथ परिवर्तन या इस तरह छायांकन करने के बारे में चिंता करने की ज़रूरत है, तो मुझे नहीं लगता कि आप जो मांग रहे हैं वह पूरी तरह से संभव है। –

+1

@ सैम रॉबर्ट्स दिलचस्प बिंदु। यह व्यक्तिगत रूप से मेरे लिए कोई समस्या नहीं है - मैं स्टूडियस से रन-टाइम पथ परिवर्तन और डुप्लिकेट फ़ंक्शन नामों से बचता हूं - लेकिन आपकी टिप्पणी निश्चित रूप से इस विषय में रुचि रखने वाले अन्य लोगों के लिए एक मूल्यवान संसाधन है। बहुत धन्यवाद। –

संबंधित मुद्दे