Как создать указатели функций из строкового ввода в 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
и дополнительное обслуживание связанное с переключателем заявление.