MATLAB爱好者论坛-LabFans.com

MATLAB爱好者论坛-LabFans.com (https://www.labfans.com/bbs/index.php)
-   资料存档 (https://www.labfans.com/bbs/forumdisplay.php?f=72)
-   -   如何从MATLAB中输入的字符串创建函数指针? (https://www.labfans.com/bbs/showthread.php?t=22950)

poster 2019-12-10 16:49

如何从MATLAB中输入的字符串创建函数指针?
 
如果我在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变量内部命名函数的指针。有什么想法可以做到吗?


回答:
[B]选项1: [/B]

使用[URL="https://www.mathworks.com/help/matlab/ref/str2func.html"]str2func[/URL]函数(假定type的字符串与该函数的名称相同):

p = str2func(type); % Create function handle using function name c = p(phi, lambda); % Invoke function handle [B]注意:[/B]文档中提到了这些限制:
[INDENT]使用str2func创建的函数句柄无权访问其本地工作空间之外的变量或嵌套函数。如果函数句柄包含这些变量或函数,则调用该句柄时MATLAB®会引发错误。

[/INDENT][B]选项2: [/B]

使用[URL="https://www.mathworks.com/help/matlab/ref/switch.html"]SWITCH[/URL]语句和[URL="https://www.mathworks.com/help/matlab/matlab_prog/creating-a-function-handle.html"]函数句柄[/URL] :

switch type case 'Mercator' p = @Mercator; case 'KavrayskiyVII' p = @KavrayskiyVII; ... % Add other cases as needed end c = p(phi, lambda); % Invoke function handle [B]选项3: [/B]

使用[URL="https://www.mathworks.com/help/matlab/ref/eval.html"]EVAL[/URL]和[URL="https://www.mathworks.com/help/matlab/matlab_prog/creating-a-function-handle.html"]函数句柄[/URL] (由[URL="https://stackoverflow.com/questions/1820802/how-can-i-create-function-pointers-from-a-string-input-in-matlab/1820818#comment1711379_1820818"]Andrew Janke[/URL]建议):

p = eval(['@' type]); % Concatenate string name with '@' and evaluate c = p(phi, lambda); % Invoke function handle 正如安德鲁指出的那样,这避免了str2func的限制以及与switch语句相关的额外维护。



[url=https://stackoverflow.com/questions/1820802]更多&回答...[/url]


所有时间均为北京时间。现在的时间是 00:58

Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.