【问题标题】:Matlab - Check if function handle is a particular function or function typeMatlab - 检查函数句柄是否是特定函数或函数类型
【发布时间】:2013-08-12 09:30:18
【问题描述】:

问题:在Matlab中,如何检查函数句柄是否为特定函数或函数类型?

示例:f1 成为函数句柄。如何检查f1 是否是内置的Matlab 函数mean?如何检查f1 是否为匿名函数?

我目前的解决方案:我目前对这个问题的解决方案是调用functions 函数。 functions 接受函数句柄作为输入,并返回包含有关输入函数句柄信息的结构,例如函数类型、路径、函数名称等。它可以工作,但它不是一个理想的解决方案,因为引用 official documentation

“注意 MATLAB® 提供 functions 函数仅用于查询和调试目的。由于其行为在后续版本中可能会发生变化,因此您不应依赖它进行编程。”

【问题讨论】:

  • 这是一个抽象的有效问题,但我想知道你为什么需要这样做?你试图做的问题背后的更大的事情是什么?
  • @SamRoberts 在接受f1 作为其输入之一的函数中,如果f1 是许多公认的函数之一,例如样本意思等。但是,我也希望该功能适用​​于其他类型的功能f1,这些快捷方式是不可能的。这有意义吗?
  • Colin,你可能想通读这篇文章,特别是 MathWorks 的 Loren Shure 的两个 cmets(一个引用,一个在实际 cmets 中):undocumentedmatlab.com/blog/… 这表明一些内置函数,如因为cellfun 面临与您相同的问题,并通过在同一位置允许函数句柄和一组有限的字符串参数来解决该问题,从而为预设字符串提供替代且更快的代码路径。只是一个想法。
  • @SamRoberts 这是一本非常有趣的书,谢谢 - 它确实强化了您之前关于重复函数名称的观点。很高兴看到我不是唯一一个试图处理这个问题的人:-)

标签: matlab function-handle


【解决方案1】:

使用 func2str 怎么样?

如果这是一个内置函数,它应该只返回一个包含函数名称的字符串;如果它是一个匿名函数,它应该返回匿名函数(包括@)。

h1 = @(x) x.^2;
h2 = @mean;
str1 = func2str(h1);  %str1 = "@(x) x.^2"
str2 = func2str(h2);  %str2 = "mean"

您也可以使用 isequal 来比较两个函数句柄(ETA:这将无法比较两个匿名函数,除非其中一个是作为另一个的副本创建的):

isequal(h1,@mean);  % returns 0
isequal(h2,@mean);  % returns 1

【讨论】:

  • 您需要小心这一点 - 如果路径发生变化,它将不起作用。例如:在路径上创建用户自定义函数mean。使用f=@mean 处理它。删除用户自定义函数。使用g=@mean 处理内置的mean。现在func2str(f)func2str(g) 都返回mean。此外(这对我来说似乎是一个错误)isequal(f,g) 返回true。但它们是不同的东西,f 现在会因为文件不可访问而出错。如果您需要担心这样的路径更改或功能阴影,我认为您所要求的不是完全可能的。
  • @SamRoberts 有趣的一点。这对我个人来说不是问题——我刻意避免运行时路径更改和重复的函数名称——但对于对这个主题感兴趣的其他人来说,您的评论绝对是一个宝贵的资源。非常感谢。
猜你喜欢
  • 1970-01-01
  • 2021-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多