9

如果我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等(都为phiand取值lambda),我想以p与上面相同的方式将所选函数分配给,以便我可以多次调用它(使用可变大小的矩阵和使用eval不可能或完全混乱的东西)。

我有一个变量 ,type它将是所需函数的名称之一(例如'Mercator','KavrayskiyVII'等)。我想我需要制作p一个指向type变量内部命名的函数的指针。任何想法我怎么能做到这一点?

4

1 回答 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 语句相关的限制和额外维护。

于 2009-11-30T16:23:47.127 回答