如果我在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文件,子函数或嵌套函数)。
假设我有m文件,例如Mercator.m , KavrayskiyVII.m等(都带有phi和lambda的值),并且我KavrayskiyVII.m一样将所选函数分配给p我可以多次调用它(使用可变大小的矩阵,并且使用eval可能会导致完全混乱或混乱)。
我有一个变量type ,它将是所需功能的名称之一(例如'Mercator' , 'KavrayskiyVII'等)。我想我需要使p成为指向type变量内部命名函数的指针。有什么想法可以做到吗?
回答:
选项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语句相关的额外维护。
更多&回答...