如果我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
变量内部命名函数的指针.我有什么想法可以做到这一点?
使用该str2func
函数(假设字符串type
输入与函数名称相同):
p = str2func(type); % Create function handle using function name c = p(phi, lambda); % Invoke function handle
注意:文档提到了这些限制:
使用创建的函数句柄
str2func
无法访问其本地工作空间之外的变量或嵌套函数.如果函数句柄包含这些变量或函数,则在调用句柄时MATLAB®会引发错误.
使用SWITCH语句和函数句柄:
switch type case 'Mercator' p = @Mercator; case 'KavrayskiyVII' p = @KavrayskiyVII; ... % Add other cases as needed end c = p(phi, lambda); % Invoke function handle
使用EVAL和函数句柄(Andrew Janke建议):
p = eval(['@' type]); % Concatenate string name with '@' and evaluate c = p(phi, lambda); % Invoke function handle
正如Andrew指出的那样,这避免了str2func
与switch语句相关的限制和额外维护.