正如here所述,我创建了自己的figure.m
,它很好地重载了内置的figure
命令。现在,每当我启动MATLAB时,我都会收到警告
警告:函数C:\ somepath \ figure.m有 与MATLAB内置的同名。我们 建议您将该功能重命名为 避免潜在的名称冲突。
有没有办法停用此警告,因为在我的情况下它是理想的行为?
你可能会说我应该以不同的方式调用我的函数而不是重载,但我觉得我的开发系统这种重载是正确的方法...
更新
如Aabaz所述,您可以使用
全局关闭此警告warning off MATLAB:dispatcher:nameConflict
需要在matlabrc.m
的开头(设置路径之前)。但是,我仍然会对一个解决方案感兴趣,该解决方案可以特定删除此错误消息以重载figure.m(或一些自定义的函数列表)而不是所有函数。我想我在这里问得太多了一些;-)?
答案 0 :(得分:4)
我似乎无法使用我的Matlab版本(R2008b)复制此警告,但无论如何如果您还没有尝试过,您应该查看允许您识别和转向的函数lastwarn和warning关闭这个警告。
PS:警告最终出于某种原因而且我能够使用lastwarn并发出警告将其关闭。>>[msgstr msgid]=lastwarn;
>>disp(msgid);
MATLAB:dispatcher:nameConflict
>>warning('off',msgid);
我应该补充一点,你应该在startup关闭它,以便在不同的Matlab会话之间有效。
答案 1 :(得分:2)
我刚刚在MATLAB R2014b上遇到了这个问题,我还想覆盖figure
。我认为这是最新问题的最接近解决方案(3。5年后......)。
我认为使用评论中的“脏”技巧实际上是最干净的,如果做得很聪明,因为它不需要您更改matlabrc.m
并且可以仅针对您想要的功能禁止警告覆盖内置的。
~/Documents/MATLAB/overrides
放在我的Mac上。我有例如~/Documents/MATLAB/overrides/figure.m
startup.m
在关闭警告的情况下向路径添加替换,然后重新打开: warning off MATLAB:dispatcher:nameConflict
addpath('/Users/victor/Documents/MATLAB/overrides');
warning on MATLAB:dispatcher:nameConflict
不确定代字号扩展是否与addpath
一起使用,所以我写出完整路径。
这样做会有选择地仅针对从overrides
加载的内容禁止警告。当然,您可以对文件夹命名更具选择性。这也意味着我不必更改我的MATLAB系统文件中的任何内容,因此它已本地化到我的用户帐户并在升级期间保持不变(无论好坏;负责任的猴子补丁)。
要从我的覆盖中访问内置figure
,我必须暂时cd
(否则覆盖将简单地称之为自己)。所以figure.m
看起来像这样:
function fig = figure(varargin)
% Call original figure function
old = pwd;
cd(fullfile(matlabroot, 'toolbox', 'matlab', 'graphics', ''));
fig = figure(varargin{:});
cd(old);
% ...
% Do dirty override magic
end
答案 2 :(得分:1)
我还没有发表评论,所以我只是在这里进一步扩展 vicvicvic 给出的答案。一般过程保持不变,但它有一些进一步的微调。
path
不在的文件夹中,例如/users/heidelberg/.matlab/_overload
。对我来说,支持波浪扩展,但我不会依赖它。但是,您也可以将它放在MATLAB启动脚本的子文件夹中(见下文)。使用startup.m
将覆盖文件夹添加到路径中。要避免警告,请确保已将其关闭,然后恢复其原始状态
% save the current state while switching it off
warningState = warning('off', 'MATLAB:dispatcher:nameConflict');
addpath('/users/heidelberg/.matlab/_overload');
% restore the saved state
warning(warningState);
% cleanup
clear('warningState');
这里的区别在于,例如无论如何,管理员将警告设置为关闭,您不会意外地将其重新打开。
在您的图形实现中,您可能需要调用内置版本。 vicvicvic 向该目录建议了cd
,但是还有MATLAB函数builtin
,它为您完成了这项工作:
function fig = figure(varargin)
% overload function
% call builtin figure
varargout = cell(1, nargout);
[varargout{:}] = builtin('figure', varargin{:});
% do you magic here
% ...
end
此外,使用varargout
和nargout
来保留任意数量的输出参数(此处和现在可能无关紧要,但对于其他函数或将来的版本可能很重要)。
<强>注释强>
我更喜欢的方法是在存储我的startup.m
文件的目录中有一个子文件夹,例如, _overload
。对我而言,这是/users/timm/Documents/MATLAB/_overload
。要轻松添加此文件夹,请使用以下脚本:
档案/users/timm/Documents/MATLAB/startup.m
% extract the current directory (pwd can fail if started elsewhere)
[currentPath, ~, ~] = fileparts(mfilename('fullpath'));
% add the path, compare above
warningState = warning('off', 'MATLAB:dispatcher:nameConflict');
addpath([currentPath, filesep(), '_overload']);
warning(warningState);
% cleanup
clear('currentPath', 'warningState');
答案 3 :(得分:1)