【问题标题】:Function name conflict. How to call a MATLAB toolbox function instead an user-defined function函数名冲突。如何调用 MATLAB 工具箱函数而不是用户定义函数
【发布时间】:2015-03-26 19:45:28
【问题描述】:

我有一个可以通过更改函数名称来解决的问题。但我想知道是否可以选择调用与我的用户定义函数同名的 MATLAB 定义函数。默认情况下,MATLAB 总是使用用户定义的函数,但我想在同一个脚本中同时使用这两个函数。 有什么想法吗?

MATLABfuzzytoolbox::addrule(); 用户定义::addrule()

【问题讨论】:

  • Matlab 将使用搜索路径中最先出现的脚本。如果您总是想使用 Matlab,请更改名称或使用 .m 文件的完整路径调用它

标签: matlab


【解决方案1】:

Matlab 使用路径中显示的第一个具有指定名称的函数,并且没有专门调用共享相同名称的函数的机制。

一个好的做法是将您的函数放入packages。通过这种方式,您可以使用与内置函数相同的名称来命名它们,但调用方式略有不同:例如,如果您在包 Pack 中有一个函数 addrule +Pack文件夹中的文件addrule.m),你可以用Pack.addrule调用它,而内置的addrule函数只是由addrule调用。

最好的,

【讨论】:

  • 我完全同意。这应该始终是首选方式。我想说,几乎任何选择的语言都有可能遇到同样的问题。这就是为什么会有类、命名空间、包……等等。此外,您可能希望为不同的“类型”做同样的事情。那么同名的函数优先,但是实现的代码可能完全不同。
【解决方案2】:

获取原始addrule 函数的句柄使用函数对其进行映射之前:

fuzzy_addrule = @addrule;

此语句中的定义是“冻结的”,意思是如果您稍后重新定义或隐藏addrulewon't affect fuzzy_addrule

您现在可以定义您的 addrule 函数,它将影响原始的 addrule,而不是 fuzzy_rule

addrule = @(x,y) x+y; %// very simple example

所以,要使用您的函数,您只需编写:

>> addrule(3,4)
ans =
     7 %// your function's result

要使用你调用fuzzy_addrule的原始函数:

>> fuzzy_addrule(readfis('tipper'),[]) %// example call for fuzzy/addrule function
ans = 
            name: 'tipper'
            type: 'mamdani'
       andMethod: 'min'
        orMethod: 'max'
    defuzzMethod: 'centroid'
       impMethod: 'min'
       aggMethod: 'max'
           input: [1x2 struct]
          output: [1x1 struct]
            rule: [1x3 struct]

以上要求在定义函数之前创建工具箱函数的句柄。如果你想在你的函数被定义之后访问工具箱函数,你可以这样做:

  1. 暂时改到工具箱文件夹,让工具箱函数has precedenceover functions放在路径上。
  2. 定义函数句柄fuzzy_addrule。由于工具箱函数现在可见,句柄引用该函数。
  3. 改回原来的文件夹。现在您的函数再次具有优先权(它隐藏了工具箱函数),但您拥有工具箱函数的句柄 fuzzy_addrule

代码:

curdir = pwd; %// take note of current folder
t = which('addrule', '-all'); %// t{1} is your function, t{2} is the toolbox function
fuzdir = regexp(t{2},'.+\\','match'); %// get only folder part
cd(fuzdir{1}); %// change to that folder
fuzzy_addrule = @addrule; %// define function handle
cd(curdir); %// restore folder

完成此操作后,可以按上述方式调用每个函数。

【讨论】:

  • 这是绕过问题的好方法。但是您必须在创建个人函数之前 这样做(否则您必须使其暂时对 matlab 不可见)。它也是临时的(您的下一个 Matlab 会话将不记得函数句柄)。但是对于临时快速解决方案来说,这是一个不错的技巧,+1,因为我也可以为自己重复使用它。
  • @Hoki 我完全同意。这是这种方法的主要缺点:您需要提前完成
  • 好吧,如果你想在多个会话中使用它,在计划使用这两个版本的脚本或函数中,你总是可以这样做:movefile('addrule.m','addrule_backup.m') ; fuzzy_addrule = @addrule ; movefile('addrule_backup.m','addrule.m')。有点复杂,但每次都能解决问题。
  • @Hoki 我找到了一种方法来创建个人功能之后。请参阅编辑
  • 哈哈..干得好。我刚刚在Matlab central 上读到了这个,我正要建议你做这样的事情。它确实有效,而我无法使我的解决方案发挥作用。我会删除我的。
【解决方案3】:

这会有帮助吗:

http://se.mathworks.com/help/matlab/ref/builtin.html

我不确定它是否仅适用于“类”定义,或者它是否也适用于一般脚本/函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-16
    • 2019-12-30
    • 1970-01-01
    • 2015-05-21
    • 1970-01-01
    • 1970-01-01
    • 2020-12-27
    • 1970-01-01
    相关资源
    最近更新 更多