MATLAB-将函数句柄参数作为句柄传递给另一个函数

时间:2009-10-22 14:27:24

标签: matlab genetic-algorithm function-handle nested-function

处理涉及遗传算法的任务(头痛,负担乐趣)。我需要能够测试不同的交叉方法和不同的变异方法,以比较它们的结果(我必须为课程写的部分论文)。因此,我想将函数名称传递给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,并且非常不满意。

虽然我知道是的,但我可以重写我的代码以使其工作方式不同,我现在很好奇如何让它实际上工作

非常感谢任何帮助。

1 个答案:

答案 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')