【问题标题】:Strange Function with duplicate name "DoBenchmark" cannot be defined as the function is defined only at one place无法定义具有重复名称“DoBenchmark”的奇怪函数,因为该函数仅在一个地方定义
【发布时间】:2019-05-08 12:24:35
【问题描述】:

(在最新的 windows10 下使用 Matlab 2018b。)我有一个文件夹 Folder 包含 DoStuff.m,其代码是:

%addpath('./SubFolder/SubSubFolder'); // SubSubFolder contains mex file defining myFunction used below
%close all;

function [res] = DoStuff(param) % Function has same name as the script defining it

    res = myFunction(param)

end

其中myFunction 定义在mexw64 文件中,该文件包含在'./SubFolder/SubSubFolder' 中。

当然,在 Matlab 的 GUI(文件夹 Folder)中执行函数 DoStuff(param) 会引发以下错误:

'myFunction' is not found in the current folder or on the MATLAB path, but exists in ...

...在'./SubFolder/SubSubFolder'。高超。因此,我删除了DoStuff.m 第一行中的% 并在Matlab 的GUI 中(在文件夹Folder 中)重新执行函数DoStuff(param) 并得到以下错误:

Function with duplicate name "DoStuff" cannot be defined.

奇怪,DoStuff 只在一个地方定义:在DoStuff.m 脚本中。 (由 Folder 中的 Matlab 中的 which -all DoStuff 确认。)

备注。在 Matlab2018b 中,可以在名为 toto.m 的脚本中定义一个名为 toto 的函数,Matlab 不会有任何问题。所以我的问题与相同的命名无关。它与添加addpath 行有关,但我不知道怎么做。确认这种感觉:用res = 1 替换行res = myFunction(param) 并取消注释添加路径也会导致命名错误。

【问题讨论】:

  • 那句话是完全错误的,是基于误解。尝试使用名称 DoStuff.m 保存 this code 并运行它。看看你得到了什么。您不能在名为 toto 的脚本中定义名为 toto 的函数。如果在定义函数之前脚本中没有可执行行,那么它是函数文件而不是脚本文件,因此完全没问题
  • 我建议,正如我在回答您之前的问题时所做的那样,将 MEX 文件放入 Folder/privateprivate 是一种特殊的目录,您不需要添加到路径中。其中的函数只能被Folder中的函数访问。
  • addpath 会全局影响 MATLAB。您不能仅更改一项功能的路径。此外,它会带来很大的开销,因为 MATLAB 需要索引添加到路径中的目录。如果你想重复调用它,你调用 MEX 文件的 M 文件不应该有这个开销。

标签: windows matlab mex


【解决方案1】:

如果函数位于脚本文件中,则 m 文件的名称必须与函数的名称不同。即如果 DoStuff 不是函数文件,则您的 m 文件名不能是 DoStuff.mDoStuff.m 应该是这样的函数文件:

function [res] = DoStuff(param) % Note that there is no executable line before this
res = myFunction(param)
end

或者你应该重命名你的函数或你的 m 文件。

假设你重命名你的 m 文件,你可以这样使用它:

addpath('./SubFolder/SubSubFolder'); %SubSubFolder contains mex file defining myFunction
close all;

res = DoStuff(param); %Calling the function

function [res] = DoStuff(param)
res = myFunction(param)
end

【讨论】:

  • "如果函数位于脚本文件中,则 m 文件的名称必须与函数的名称不同。即如果 DoStuff 不是函数文件。”我不明白这一点,我有大量在同名脚本中定义的模拟函数示例(但没有调用 mex 函数,也没有添加路径)可以完美运行。通常,如果我将 res = myFunction(param) 替换为 res = 1 并将 addpath 行注释掉,Matlab 不会抱怨。
  • @ujsgeyrr 模拟函数是什么意思?没有这个词
  • “类比”是指“相似”。详细看我之前的评论。并且“如果函数位于脚本文件中,则 m 文件的名称必须与函数的名称不同。” --> 这是错误的。在Matlab中试一下,你会发现确实可以在toto.m的脚本中定义一个名为toto的函数,Matlab不会有任何问题。
  • @ujsgeyrr 主要部分是“保留 addpath 行的注释”。这改变了一切。取消注释它,你会看到同样的事情。这些文件中没有任何可执行行;否则你肯定会得到那个错误。
  • @ujsgeyrr 强调“可执行”这个词。如果您在定义函数之前有一个可执行行,那么您的 m 文件实际上是一个包含该函数的脚本;不是函数文件。请注意,带有 cmets 的行是不可执行的
猜你喜欢
  • 2019-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-16
  • 2012-08-18
  • 2018-09-09
  • 2014-06-14
相关资源
最近更新 更多