9

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

function newpop = Repopulate(population, crossOverMethod, mutationMethod) 
    ... 
    child = crossOverMethod(parent1, parent2, @mutationMethod); 
    ... 

function child = crossOverMethod(parent1, parent2, mutationMethod) 
    ... 
    if (mutateThisChild == true) 
    child = mutationMethod(child); 
    end 
    ... 

यहां मुख्य बिंदु 3 की तरह है, पैरामीटर 3: मैं mutationMethod को दूसरे स्तर पर कैसे पास करूं? अगर मैं @ प्रतीक का उपयोग, मुझे बताया गया हो:

"mutationMethod" was previously used as a variable, 
conflicting with its use here as the name of a function or command. 

मैं @ प्रतीक का उपयोग नहीं करते हैं, तो mutationMethod कहा जाता हो जाता है, कोई पैरामीटर के साथ, और काफी दुखी है।

जबकि मुझे पता है कि हाँ, मैं इसे अपने कोड को अलग-अलग काम करने के लिए फिर से लिख सकता हूं, अब मैं इसे वास्तव में कार्य पर कैसे बना सकता हूं।

किसी भी मदद की बहुत सराहना की जाती है।

उत्तर

13

असल में बस @ प्रतीक का उपयोग न करें, इसे पर कॉल करें, इसके बजाय फ़ंक्शन को दोबारा बदलें। उदाहरण:

function x = fun1(a,m) 
    x = fun2(a,m); 
end 

function y = fun2(b,n) 
    y = n(b); 
end 

जिन्हें हम के रूप में:

> fun1([1 2 3], @sum) 
6 

के लिए Passing Function Handle Arguments


नोट दस्तावेज़ देखें आप देख सकते हैं कि तर्क एक समारोह संभाल कर रहा है: isa(m,'function_handle')। इसलिए आप अपने समारोह फिर से आबाद एक स्ट्रिंग के रूप में दोनों एक समारोह संभाल और एक समारोह नाम को स्वीकार कर और अधिक लचीला बना सकते हैं:

function x = fun(a,m) 
    if ischar(m) 
     f = str2func(m); 
    elseif isa(m,'function_handle') 
     f = m; 
    else 
     error('expecting a function') 
    end 
    x = fun2(a,f); 
end 

जो अब दोनों तरीकों से कहा जा सकता है:

fun1([1 2 3], @sum) 
fun1([1 2 3], 'sum')