Динамическая функция обрабатывает Matlab - PullRequest
1 голос
/ 29 марта 2019

У меня есть следующий дескриптор функции

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 Ответ

2 голосов
/ 29 марта 2019

Вероятно, вам нужно создать несколько дескрипторов функций, а затем динамически выбрать один из них.Например:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...