Как создать указатели функций из строкового ввода в MATLAB?

если я использую inline функция в MATLAB я могу создать одно имя функции, которое может реагировать по-разному в зависимости от предыдущих вариантов:

if (someCondition)
  p = inline('a - b','a','b');
else
  p = inline('a + b','a','b');
end

c = p(1,2);
d = p(3,4);

но встроенные функции, которые я создаю, становятся довольно эпическими, поэтому я хотел бы изменить их на другие типы функций (т. е. m-файлы, подфункции или вложенные функции).

предположим, у меня есть m-файлы, такие как Mercator.m, KavrayskiyVII.m, etc. (все принимают значение для phi и lambda), и я хотел бы назначить выбранная функция для p таким же образом, как у меня выше, чтобы я мог называть его много раз (с матрицами переменного размера и вещами, которые делают использование eval либо невозможно, либо полная неразбериха).

у меня есть переменная, type, это будет одно из имен функций (например,'Mercator', 'KavrayskiyVII', etc.). Я считаю, что мне нужно сделать p в указатель на функцию, названную внутри type переменной. Любой идеи, как я могу это сделать?

1 ответов


#1:

использовать str2func функция (предполагает строку в type совпадает с именем функции):

p = str2func(type);  % Create function handle using function name
c = p(phi, lambda);  % Invoke function handle

Примечание: в документации упоминаются следующие ограничения:

дескрипторы функций, созданные с помощью str2func не имеют доступа к переменным вне их локальной рабочей области или к вложенным функциям. Если дескриптор функции содержит эти переменные или функции, MATLAB выдает ошибка при вызове обработки.

Вариант № 2:

использовать переключатель заявления и ручки:

switch type
  case 'Mercator'
    p = @Mercator;
  case 'KavrayskiyVII'
    p = @KavrayskiyVII;
  ...                    % Add other cases as needed
end
c = p(phi, lambda);      % Invoke function handle

Вариант № 3:

использовать оценку и ручки (по предложению Андрей Янке):

p = eval(['@' type]);  % Concatenate string name with '@' and evaluate
c = p(phi, lambda);    % Invoke function handle

как указывает Эндрю, это позволяет избежать ограничений str2func и дополнительное обслуживание связанное с переключателем заявление.