Как я могу создать указатели на функции из строкового ввода в MATLAB? - PullRequest
9 голосов
/ 30 ноября 2009

Если я использую функцию 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 и т. Д. (Все они принимают значения для phi и lambda), и я хотел бы назначить выбранную функцию для p таким же образом, как я описал выше, чтобы я мог вызывать его много раз (с матрицами переменного размера и тому, что делает использование eval невозможным или полным беспорядком).

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

1 Ответ

19 голосов
/ 30 ноября 2009

Вариант № 1:

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

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

ПРИМЕЧАНИЕ: В документации упоминаются эти ограничения:

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

Вариант № 2:

Используйте оператор SWITCH и дескрипторы функций :

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

Вариант № 3:

Использовать EVAL и функциональные ручки (предложено Andrew Janke ):

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

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

...