【问题标题】:How to use MATLAB toolbox function which has the same name of a user defined function如何使用与用户定义函数同名的MATLAB工具箱函数
【发布时间】:2019-06-12 19:18:01
【问题描述】:

findpeaks 函数有问题,该函数在信号处理工具箱中,而且程序还有另一个版本(用户定义函数)。我需要在信号处理工具箱中调用 on 而不是用户定义的工具箱,而且由于多种原因我无法重命名用户定义的函数。谁能帮我调用工具箱功能。

【问题讨论】:

  • 只需重新排序 Matlab 路径,并确保您希望调用函数的特定工具箱在用户定义函数之前 。完成后,使用命令which findpeaks 仔细检查将调用哪一个。
  • 另外:这正是 MATLAB 建议不要为用户定义的函数使用通用文件名的原因。打电话给他们,例如my_findpeaks 之类的,以防止这些问题
  • 为了解决这些歧义,创建了 namespacing。我建议将该函数放入一个类中,然后您只能使用classNameOrInstance.findpeaks() 访问它。
  • @Hoki 这不是一个有用的响应,因为每次所需功能发生变化时都需要手动干预。事实上,这就是R 引入命名空间的原因,因此您可以指定您希望调用哪个版本的屏蔽函数。
  • @Adriaan 这就是我们在业务中所说的“kludgey workaround”——这是 mathworks 的错,不是你的错。

标签: matlab


【解决方案1】:

MATLAB 使用的优先顺序在其help pages 中进行了描述。它指出当前文件夹 (9.) 中的函数优先于路径 (10.) 中其他位置的函数。然后,选择该函数在路径中的第一次出现。这允许许多可能的解决方案:

1. cd 到文件夹

一个很简单的方法就是把当前工作区目录改成你需要调用的函数所在的文件夹,即cd改成你自定义函数所在的地方,或者cd改成工具箱路径. 注意:这很不优雅,但有时​​可能是最简单的解决方案。

2。重新排序路径

如前所述,MATLAB 选择路径中第一次出现的函数。因此,您可以重新排序路径变量,因此您的用户定义函数所在的文件夹最后出现。可以使用path 函数查看和操作路径变量。 注意: 那么你只能调用工具箱函数。否则,您将不得不再次使用该路径。

3.函数句柄

如果您需要能够同时调用这两个函数,则为这两个版本创建一个函数句柄会很有用。为此,您必须 cd 进入定义函数的文件夹并在那里创建一个新句柄:

cd('path/to/userdefined/function')
userFindPeaks = @findpeaks;
cd('path/to/MATLAB/installation/toolbox/signal/signal')
toolboxFindPeaks = @findpeaks;

然后您可以使用feval 调用这些函数。

当然,正如 Adriaan 在 cmets 中提到的,最好不要将已定义函数的名称用于您自己的函数或变量名称。

【讨论】:

  • 不应该“4. 直接使用signal.findpeaks或通过句柄”工作吗?
  • @AndrasDeak 我刚刚在 R2014a 上尝试过,但它不起作用。
  • @hbaderts 对不起,我没有signal,所以我检查了distributed.eye。原来它也是一个类,这就是它起作用的原因......再次抱歉!
【解决方案2】:

我只是来这里寻找同样的东西......我最终使用了builtinhttps://uk.mathworks.com/help/matlab/ref/builtin.html

[y1,...,yn] = builtin(function,x1,...,xn)

@arr_sea 实际上在其中一个折叠的 cmets 中发布了一个 link,它在不同的上下文中使用此函数。

【讨论】:

  • 这个解决方案很棒,但只适用于内置函数。对于链接页面:“内置函数是 MATLAB 可执行文件的一部分。 MATLAB 未在 MATLAB 语言中实现这些函数。 [...] 您可以使用语法 which function 来检查函数是否是内置的。” OP中的函数findpeaks不是内置的,它是一个M文件(没有内置的工具箱函数)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-16
  • 2014-04-20
  • 2015-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多