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