如何在MATLAB中从字符串输入创建函数指针?

9
如果我在MATLAB中使用inline函数,我可以创建一个单一的函数名称,该名称根据先前的选择而有不同的响应:
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文件、子函数或嵌套函数)。

假设我有像Mercator.mKavrayskiyVII.m等m文件(都需要philambda的值),我希望像上面一样将所选的函数分配给p,以便我可以多次调用它(使用可变大小的矩阵和使使用eval变得不可能或非常混乱的东西)。

我有一个变量type,它将是所需函数的名称之一(例如'Mercator''KavrayskiyVII'等)。 我想把p变成指向type变量中命名的函数的指针。 有什么办法可以做到这一点吗?

1个回答

19

选项 #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

正如Andrew所指出的,这样可以避免str2func的限制以及与switch语句相关的额外维护。


2
选项3怎么样:动态函数句柄构造器:“p = eval(['@' type])”。避免了手动维护switch语句的str2func限制。 - Andrew Janke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接