【问题标题】:Call overloaded function from specific toolbox in MATLAB从 MATLAB 中的特定工具箱调用重载函数
【发布时间】:2015-01-16 23:10:53
【问题描述】:

我安装了一些 Matlab 工具箱。在我的 Matlab 版本中,其中一个 Toolbox-Functions 与另一个发生冲突。在这种情况下,它是粗麻布的。我想用symbolic-Toolbox的hessian函数。

当在 C/C++ 中函数像 cos 函数一样被多重定义时,我仍然想使用我可以编写的“标准” cos 函数:

std::cos(x);

matlab中有类似的吗?

【问题讨论】:

  • 如果您使用符号输入调用hessian,则会调用hessian 的符号工具箱版本。这还不够你的目的吗?
  • 不,因为我有符号工具箱和名为 intlab 的工具箱。当我输入 help hessian 时,我得到了 intlab 版本的帮助描述,但我想使用符号版本,如果我只调用 hessian,我会收到输入参数不足的错误,因为 intlab hessian 需要更多输入。

标签: matlab


【解决方案1】:

如果你有重载的方法并且想调用内置的方法,你可以使用函数builtin。来自official documentation

builtin(function,x1,...,xn) 执行内置函数 输入参数 x1 到 xn。使用 builtin 执行原始 从重载函数的方法中内置。去工作 正确地,你绝不能重载内置。

使用它的语法是:

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

友情提示:如果你想尝试重载内置函数(“嗯,我想知道会发生什么”),记得先保存东西。

【讨论】:

  • 我试过了,不行。因为就像我说的那样,我的问题是符号工具箱中的“hessian”-Funktion。写 builtin(‘hessian’, f) 给我一个错误,他找不到内置函数“hessian”。
【解决方案2】:

以与您为 c/c++ 描述的非常相似的方式,您可以通过首先添加工具箱的名称来使用特定的工具箱功能:ToolboxName\function2call()

首先使用which 命令确定将使用特定调用语法从哪个工具箱加载哪个函数。

由于我没有您提到的工具箱,我将使用经典的fopen 函数作为示例。

第一个不带任何其他参数调用的fopen 函数将是用于返回文件句柄的内置函数。事实上,which 命令证实了这一点:

>> which fopen
built-in (C:\TLAB13a\toolbox\matlab\iofun\fopen)

现在假设我想使用fopen 函数打开一个串口,我需要在调用fopen 前加上工具箱/对象的名称,例如:serial\fopen。让我们首先确保这种调用方式指向正确的函数:

>> which serial\fopen
C:\TLAB13a\toolbox\matlab\iofun\@serial\fopen.m  % serial method

宾果游戏!

为了确保在您调用这些函数时可以正常工作,让我们真正调用它们(使用虚拟参数):

>> fopen('toto')
ans =
    -1

>> serial\fopen('toto')
Error using serial (line 72)
The PORT must be specified.

成功了。对fopen('toto') 的第一个简单调用返回-1,因为它找不到名为“toto”的文件。
第二次调用serial\fopen('toto')出错,因为没有定义串口,但是调用了正确的函数。


编辑: 您还可以通过重新排序 Matlab 路径来覆盖 Matlab 获取函数的顺序。如果您将符号工具箱放在路径中的另一个之前,那么当在没有明确信息的情况下调用时,Matlab 将执行它在路径中找到的第一个函数。

我仍然建议使用显式声明的第一个解决方案,因为如果您有许多重载函数,更改路径顺序可能会弄乱其他函数调用。

【讨论】:

  • 谢谢,这就是我要找的。你的回答对我来说很完美。您的编辑还解释了为什么另一个工具箱的功能被调用并出现在帮助描述中。
  • -1,这不起作用(至少对于 R2012a)。 serial\fopen('toto') 分别调用 serial 和 fopen 函数并尝试将结果相除!!您的声明“第二次调用 serial\fopen('toto') 出错,因为未定义串行端口,但调用了正确的函数。”完全错误,因为从错误消息中可以清楚地看出函数“serial”产生了错误(而不是fopen)。如果这个技巧可行,那就太好了,但文档似乎也没有提到带有“\”的语法实际上是有效的。 serial\fopen('com1') 也会报错。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-26
  • 1970-01-01
  • 1970-01-01
  • 2012-09-23
  • 1970-01-01
  • 2011-02-12
  • 1970-01-01
相关资源
最近更新 更多