【问题标题】:How can I create function pointers from a string input in MATLAB?如何从 MATLAB 中的字符串输入创建函数指针?
【发布时间】:2010-12-21 16:54:58
【问题描述】:

如果我在 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 变量内命名的函数的指针。有什么想法可以做到这一点吗?

【问题讨论】:

    标签: string matlab function-pointers function-handle


    【解决方案1】:

    选项#1:

    使用str2func函数(假设type中的字符串与函数名相同):

    p = str2func(type);  % Create function handle using function name
    c = p(phi, lambda);  % Invoke function handle
    

    注意:文档提到了这些限制:

    使用str2func 创建的函数句柄无法访问其本地工作区之外的变量或嵌套函数。如果您的函数句柄包含这些变量或函数,则 MATLAB® 在您调用句柄时会引发错误。

    选项 #2:

    使用SWITCH 语句和function handles

    switch type
      case 'Mercator'
        p = @Mercator;
      case 'KavrayskiyVII'
        p = @KavrayskiyVII;
      ...                    % Add other cases as needed
    end
    c = p(phi, lambda);      % Invoke function handle
    

    选项#3:

    使用EVALfunction handlesAndrew Janke 建议):

    p = eval(['@' type]);  % Concatenate string name with '@' and evaluate
    c = p(phi, lambda);    % Invoke function handle
    

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

    【讨论】:

    • 选项 3 怎么样:动态函数句柄构造函数:“p = eval(['@' type])”。在没有手动维护 switch 语句的情况下避免 str2func 限制。
    • 优秀的答案!真的非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 2011-06-05
    相关资源
    最近更新 更多