函数名冲突。如何调用MATLAB工具箱函数而不是用户定义的函数
我有一个问题可以通过更改函数名来解决。但是我想知道是否有一个选项可以调用一个MATLAB定义的函数,它与我的用户定义函数同名。默认情况下,MATLAB总是使用用户定义的函数,但我想在同一个脚本中同时使用这两个函数。 有什么想法吗 MATLABfuzzytoolbox::addrule();函数名冲突。如何调用MATLAB工具箱函数而不是用户定义的函数,matlab,Matlab,我有一个问题可以通过更改函数名来解决。但是我想知道是否有一个选项可以调用一个MATLAB定义的函数,它与我的用户定义函数同名。默认情况下,MATLAB总是使用用户定义的函数,但我想在同一个脚本中同时使用这两个函数。 有什么想法吗 MATLABfuzzytoolbox::addrule(); userDefined::addrule()Matlab使用路径中显示的具有指定名称的第一个函数,并且没有机制专门调用共享相同名称的函数之一 一个好的做法是将您的函数放入。通过这种方式,您可以使用与内置函数相
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我在创建个人函数后找到了一种方法。请见见伊迪莎哈。。做得好。我刚刚读到的正是这些,我正要建议你做一些类似的事情。当我无法使我的解决方案起作用时,它确实起作用了。我将删除我的。我完全同意。这应该始终是首选的方式。我要说的是,在几乎任何一种选择的语言中都可能遇到同样的问题。这就是为什么会有类、名称空间、包。。。等等此外,您可能希望对不同的“类型”执行相同的操作。然后,最好使用相同的函数名,但执行该函数的代码可能完全不同。