Динамическая функция обрабатывает Matlab

#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 ).