处理涉及遗传算法的任务(头痛,负担乐趣)。我需要能够测试不同的交叉方法和不同的变异方法,以比较它们的结果(我必须为课程写的部分论文)。因此,我想将函数名称传递给Repopulate方法,作为函数句柄。
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,并且非常不满意。
虽然我知道是的,但我可以重写我的代码以使其工作方式不同,我现在很好奇如何让它实际上工作。
非常感谢任何帮助。
答案 0 :(得分:13)
实际上只是不使用@符号,而是在调用 Repopulate 函数时使用它。 例如:
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')