#matlab #function
#matlab #функция
Вопрос:
У меня есть следующий дескриптор функции
rhs = @(t,p,m) function_name (t,p,m,variables)
и мне нужно динамически назвать function_name
в приведенном выше вызове, чтобы я мог позже вызвать дескриптор в другой части кода
Например:
odesolver(rhs);
Я пробовал, например :
function_names_array = ['function_1','function_2','function_3'];
paramters_array = [parameters_array_1,parameters_array_2,parameters_array_3]
for i=1:3
for j= 1:5
rhs = @(t,p,m) function_names_array(i)(t,p,m,parameters(j))
end
end
Это не сработает.
Комментарии:
1. Я обновил свой ответ.
Ответ №1:
Вероятно, то, что вы хотите сделать, это создать несколько дескрипторов функций, а затем динамически выбрать один из них. Например:
functions = {@function_1, @function_2, @function_3};
parameters = {
{1,[10,20],'a'}
{2,[10,20],'c'}
{3,[100,200],'a'}};
for i=1:numel(functions)
for j=1:numel(parameters)
rhs{i,j} = @(t,p,m) functions{i}(t,p,m,parameters{j}{:})
end
end
odesolver(rhs{2,4});
Невозможно создать массив дескрипторов функций (синтаксис был бы неоднозначным), но можно собрать их в массив ячеек, как описано выше.
Параметры также собираются в массив ячеек, что обеспечивает большую гибкость. Каждый набор параметров снова является массивом ячеек. parameters{j}{:}
представляет собой разделенный запятыми список элементов массива ячеек j
, идеально подходящий для использования в качестве списка аргументов при вызове функции.
Что касается номенклатуры: @function_1
является дескриптором именованной функции. @()...
— это анонимная функция (в других языках называется lambda). Анонимная функция — это функция, которая не имеет имени, но может быть присвоена дескриптору функции и использоваться таким образом. В любом случае, дескриптор функции — это способ использования функции в качестве переменной: вы можете передавать их в качестве аргументов функциям, возвращать их из функций и сохранять в массивах ячеек или структурных массивах. Строка с именем функции не имеет той же функции: вы не можете вызвать функцию через строку с ее именем (если вы не используете feval
или eval
).