MATLAB - передача параметра дескриптора функции в другую функцию в качестве дескриптора - PullRequest
9 голосов
/ 22 октября 2009

Работа над заданием, включающим генетические алгоритмы (множество головных болей, множество веселья). Мне нужно уметь протестировать разные методы кроссовера и разные методы мутации, чтобы сравнить их результаты (часть статьи, которую я должен написать для курса). Таким образом, я хочу просто передать имена функций в метод 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" was previously used as a variable,
 conflicting with its use here as the name of a function or command.

Если я не использую символ @, тогда вызывается mutationMethod без параметров, и он совершенно недоволен.

Хотя я знаю, что да, я мог бы просто переписать свой код, чтобы он работал по-другому, теперь мне интересно, как заставить его работать на самом деле работа .

Любая помощь очень ценится.

1 Ответ

13 голосов
/ 22 октября 2009

На самом деле просто не используйте символ @, используйте его при вызове функции 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

См. Документацию для Аргументы ручки функции прохождения


Обратите внимание, что вы можете проверить, является ли аргумент дескриптором функции: 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')
...