Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
函数名冲突。如何调用MATLAB工具箱函数而不是用户定义的函数_Matlab - Fatal编程技术网

函数名冲突。如何调用MATLAB工具箱函数而不是用户定义的函数

函数名冲突。如何调用MATLAB工具箱函数而不是用户定义的函数,matlab,Matlab,我有一个问题可以通过更改函数名来解决。但是我想知道是否有一个选项可以调用一个MATLAB定义的函数,它与我的用户定义函数同名。默认情况下,MATLAB总是使用用户定义的函数,但我想在同一个脚本中同时使用这两个函数。 有什么想法吗 MATLABfuzzytoolbox::addrule(); userDefined::addrule()Matlab使用路径中显示的具有指定名称的第一个函数,并且没有机制专门调用共享相同名称的函数之一 一个好的做法是将您的函数放入。通过这种方式,您可以使用与内置函数相

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

MATLABfuzzytoolbox::addrule();
userDefined::addrule()

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

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

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

最好的方法是,在使用函数对其进行阴影处理之前,先获得原始
addrule
函数的句柄:

fuzzy_addrule = @addrule;
此语句中的定义是“冻结”的,即如果以后重新定义或隐藏
addrule
fuzzy\u addrule

addrule = @(x,y) x+y; %// very simple example
您现在可以定义
addrule
函数,该函数将隐藏原始
addrule
,而不是
fuzzy\u rule

addrule = @(x,y) x+y; %// very simple example
因此,要使用函数,只需编写:

>> addrule(3,4)
ans =
     7 %// your function's result
要使用您调用的原始函数
fuzzy\u 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]

上面要求在定义函数之前创建工具箱函数的句柄。如果要在定义函数后访问工具箱函数,可以按如下操作:

  • 临时更改为工具箱文件夹,以便工具箱函数覆盖路径上的函数
  • 定义函数句柄
    fuzzy\u addrule
    。由于工具箱函数现在可见,因此句柄引用该函数
  • 更改回原始文件夹。现在,您的函数再次具有优先权(它遮挡了工具箱函数),但您拥有工具箱函数的句柄
    fuzzy\u addrule
  • 代码:

    完成此操作后,可以如上所述调用每个函数。

    这是否有帮助:


    我不确定它是否只适用于“类”定义,还是也适用于一般脚本/函数

    Matlab将使用搜索路径中最先出现的脚本。如果您总是想使用Matlab,可以更改名称,或者使用.m文件的完整路径调用它,这是绕过问题的好方法。但是,在创建个人函数之前,必须这样做(否则,您必须使它暂时对matlab不可见)。这也是暂时的(您的下一个Matlab会话将不会记住函数句柄)。但对于一个临时的快速解决方案来说,这是一个很好的技巧,+1表示我可能也会为自己重新使用它。@Hoki我完全同意。这是这种方法的主要缺点:您需要提前完成。如果您想在计划同时使用两个版本的脚本或函数的多个会话中使用它,您可以随时执行:
    movefile('addrule.m','addrule\u backup.m');fuzzy_addrule=@addrule;movefile('addrule\u backup.m','addrule.m')
    。虽然有点复杂,但每次都会奏效。@Hoki我在创建个人函数后找到了一种方法。请见见伊迪莎哈。。做得好。我刚刚读到的正是这些,我正要建议你做一些类似的事情。当我无法使我的解决方案起作用时,它确实起作用了。我将删除我的。我完全同意。这应该始终是首选的方式。我要说的是,在几乎任何一种选择的语言中都可能遇到同样的问题。这就是为什么会有类、名称空间、包。。。等等此外,您可能希望对不同的“类型”执行相同的操作。然后,最好使用相同的函数名,但执行该函数的代码可能完全不同。