当重载内置函数时,避免MATLAB启动警告?

时间:2011-06-20 08:48:35

标签: matlab suppress-warnings overloading

正如here所述,我创建了自己的figure.m,它很好地重载了内置的figure命令。现在,每当我启动MATLAB时,我都会收到警告

  

警告:函数C:\ somepath \ figure.m有   与MATLAB内置的同名。我们   建议您将该功能重命名为   避免潜在的名称冲突。

有没有办法停用此警告,因为在我的情况下它是理想的行为?

你可能会说我应该以不同的方式调用我的函数而不是重载,但我觉得我的开发系统这种重载是正确的方法...

更新

如Aabaz所述,您可以使用

全局关闭此警告
warning off MATLAB:dispatcher:nameConflict

需要在matlabrc.m的开头(设置路径之前)。但是,我仍然会对一个解决方案感兴趣,该解决方案可以特定删除此错误消息以重载figure.m(或一些自定义的函数列表)而不是所有函数。我想我在这里问得太多了一些;-)?

4 个答案:

答案 0 :(得分:4)

我似乎无法使用我的Matlab版本(R2008b)复制此警告,但无论如何如果您还没有尝试过,您应该查看允许您识别和转向的函数lastwarnwarning关闭这个警告。

PS:警告最终出于某种原因而且我能够使用lastwarn并发出警​​告将其关闭。

>>[msgstr msgid]=lastwarn;
>>disp(msgid);
MATLAB:dispatcher:nameConflict
>>warning('off',msgid);

我应该补充一点,你应该在startup关闭它,以便在不同的Matlab会话之间有效。

答案 1 :(得分:2)

我刚刚在MATLAB R2014b上遇到了这个问题,我还想覆盖figure。我认为这是最新问题的最接近解决方案(3。5年后......)。

我认为使用评论中的“脏”技巧实际上是最干净的,如果做得很聪明,因为它不需要您更改matlabrc.m并且可以仅针对您想要的功能禁止警告覆盖内置的。

  1. 将所有默认覆盖放在永久MATLAB路径中不在的文件夹中。我把我的~/Documents/MATLAB/overrides放在我的Mac上。我有例如~/Documents/MATLAB/overrides/figure.m
  2. 使用startup.m在关闭警告的情况下向路径添加替换,然后重新打开:
  3.     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 给出的答案。一般过程保持不变,但它有一些进一步的微调。

  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. 在您的图形实现中,您可能需要调用内置版本。 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来保留任意数量的输出参数(此处和现在可能无关紧要,但对于其他函数或将来的版本可能很重要)。

  4. <强>注释

    我更喜欢的方法是在存储我的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)

无论是否在startup.m中添加目录,只要编辑并保存该目录中的函数,就会在搜索路径中添加包含函数重载的目录,并显示警告。

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