9

遺伝的アルゴリズムに関連する作業(頭痛の負荷、楽しい負荷)。私は、結果を比較するために、異なるクロスオーバー方法と異なる突然変異方法をテストすることができる必要があります(コースのために書かなければならない論文の一部)。そのため、関数の名前としてRepopulateメソッドに渡すだけです。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は、パラメータなしで、と呼ばれ、非常に不幸でます

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

私は認識していますが、別の方法でコードを書き直すだけで、実際にはどうすればいいのかが分かります。

ご協力いただきまして誠にありがとうございます。

答えて

13

実際には@記号は使用しないでください。代わりにRepopulate関数を呼び出すときに使用してください。 例:

私たちのように呼び出す
function x = fun1(a,m) 
    x = fun2(a,m); 
end 

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

isa(m,'function_handle')Passing Function Handle Arguments


のマニュアルを参照してください

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

は、引数がによって関数ハンドルであるかどうかをチェックすることができます。したがって、あなたは文字列として関数ハンドルと関数名の両方を受け入れることにより、より柔軟なあなたの関数再投入を行うことができます。

fun1([1 2 3], @sum) 
fun1([1 2 3], 'sum') 
:今両方の方法を呼び出すことができます

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 

関連する問題