避免在重载内置函数时发出 MATLAB 启动警告



如此处所述,我创建了自己的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并且可以仅抑制您想要覆盖内置功能的警告。

  1. 将所有默认覆盖放在不在永久 MATLAB 路径上的文件夹中。我把我的~/Documents/MATLAB/overrides放在我的Mac上。我有例如 ~/Documents/MATLAB/overrides/figure.m
  2. 使用 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 给出的答案。一般过程保持不变,但它有一些进一步的微调。

  1. 将覆盖函数 figure.m 放在当前 MATLAB path上不存在的文件夹中,例如 /users/heidelberg/.matlab/_overload .对我来说,支持波浪号扩展,但我不会依赖它。但是,您也可以将其放在 MATLAB 启动脚本的子文件夹中(见下文(。
  2. 使用 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');
    

    这里的区别在于,例如,如果您的管理员将警告设置为关闭,您不会意外地将其重新打开。

  3. 在 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
    

    此外,使用 varargoutnargout 保留任意数量的输出参数(此时此地可能无关紧要,但对于其他函数或未来版本可能很重要(。


注解

我更喜欢的一种方法是在存储我的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 中添加,都将向搜索路径添加包含函数重载的目录。

解决此问题的一种简单方法是将重载函数放在包中。然后在启动时导入包。无需弄乱警告。

最新更新