如此处所述,我创建了自己的figure.m
,它很好地重载了内置的figure
命令。现在,每当我启动 MATLAB 时,我都会收到警告
警告:函数 C:\somepath\figure.m 具有 与内置的 MATLAB 同名。我们 建议将函数重命名为 避免潜在的名称冲突。
鉴于这是我的预期行为,有没有办法停用此警告?
你可能会说我应该以不同的方式调用我的函数而不是重载,但我确实觉得对于我的开发系统来说,这种重载是正确的方法......
更新
如 Aabaz 所述,您可以使用全局关闭此警告
warning off MATLAB:dispatcher:nameConflict
这需要在matlabrc.m
的开头(在设置路径之前(进行。但是,我仍然对一种解决方案感兴趣,该解决方案可以专门删除此错误消息以重载figure.m(或一些自定义的函数列表(而不是所有函数。我想我在这里问得有点太多了;-(?
我似乎无法用我的 Matlab 版本 (R2008b( 复制此警告,但无论如何 如果您还没有尝试过,您应该查看 lastwarn 和 warning 函数,以允许您识别并关闭此警告。
PS:由于某种原因,警告最终来了,我能够使用lastwarn和警告将其关闭。
>>[msgstr msgid]=lastwarn;
>>disp(msgid);
MATLAB:dispatcher:nameConflict
>>warning('off',msgid);
我应该补充一点,您应该在启动时将其关闭,以便在 Matlab 的不同会话之间生效。
我刚刚在 MATLAB R2014b 上遇到了这个问题,我也想覆盖figure
。我认为这是您更新问题的最接近的解决方案(3.5 年后......
我认为使用您评论中的"肮脏"技巧实际上是最干净的,如果做得很巧妙,因为它不需要您更改matlabrc.m
并且可以仅抑制您想要覆盖内置功能的警告。
- 将所有默认覆盖放在不在永久 MATLAB 路径上的文件夹中。我把我的
~/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
我还不能发表评论,所以我在这里进一步扩展 vicvicvic 给出的答案。一般过程保持不变,但它有一些进一步的微调。
- 将覆盖函数 figure.m 放在当前 MATLAB
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');
这里的区别在于,例如,如果您的管理员将警告设置为关闭,您不会意外地将其重新打开。
-
在 Figure 的实现中,在某些时候您可能必须调用内置版本。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');
每当编辑和保存该目录中的函数时,只要编辑和保存该目录中的函数,无论该目录是否在 startup.m 中添加,都将向搜索路径添加包含函数重载的目录。
解决此问题的一种简单方法是将重载函数放在包中。然后在启动时导入包。无需弄乱警告。