MATLAB- передача параметра дескриптора функции в другую функцию в качестве дескриптора

Работа над заданием, включающим генетические алгоритмы (множество головных болей, множество забав). Мне нужно уметь тестировать разные методы кроссовера и разные методы мутаций, чтобы сравнить их результаты (часть статьи, которую я должен написать для курса). В связи с этим я хочу просто передать имена функций в метод 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 ответ

На самом деле просто не используйте символ @, используйте его при вызове функции 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'), Поэтому вы можете сделать свою функцию Repopulate более гибкой, принимая в качестве строки дескриптор функции и имя функции:

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')
Другие вопросы по тегам