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

在重载内置函数时避免MATLAB启动警告?,matlab,suppress-warnings,overloading,Matlab,Suppress Warnings,Overloading,如上所述,我创建了自己的figure.m,它很好地重载了内置的figure命令。现在,每当我启动MATLAB,我都会收到警告 警告:函数C:\somepath\figure.m已 与MATLAB内置的名称相同。我们 建议您将函数重命名为 避免潜在的名称冲突 考虑到这是我想要的行为,有没有办法取消此警告 你可能会说我应该以不同的方式调用我的函数,而不是重载,但我确实觉得对于我的开发系统来说,这种重载是正确的方式 更新 正如Aabaz所提到的,您可以使用 warning off MATLAB:dis

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

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

考虑到这是我想要的行为,有没有办法取消此警告

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

更新

正如Aabaz所提到的,您可以使用

warning off MATLAB:dispatcher:nameConflict

它需要在
matlabrc.m
的开头(设置路径之前)执行。然而,我仍然对一个解决方案感兴趣,该解决方案可以专门针对重载figure.m(或一些自定义函数列表)而不是所有函数删除此错误消息。我想我的要求有点太高了;-)

我似乎无法用我的Matlab版本(R2008b)复制此警告,但无论如何,如果您尚未尝试此警告,则应查看允许您识别并关闭此警告的函数

PS:由于某种原因,警告终于出现了,我可以使用lastwarn和warning将其关闭

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

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

我刚刚在Matlab R2014b上遇到了这个问题,我还想覆盖
。我认为这是最接近您更新问题的解决方案(3.5年后…)

我认为使用您评论中的“脏”技巧实际上是最干净的,如果操作巧妙的话,因为它不需要您更改
matlabrc.m
,并且可以仅对您想要覆盖内置函数的函数取消警告

  • 将所有默认覆盖放在不在永久路径上的文件夹中。我把我的文件保存在Mac上的
    ~/Documents/MATLAB/overrides
    中。例如,我有
    ~/Documents/MATLAB/overrides/figure.m
  • 使用
    startup.m
    在警告关闭的情况下向路径添加覆盖,然后再将其打开:
  • 警告关闭MATLAB:调度程序:名称冲突
    addpath('/Users/victor/Documents/MATLAB/overrides');
    MATLAB上的警告:调度程序:名称冲突
    
    不确定tilde扩展是否适用于
    addpath
    ,因此我写出了完整的路径

    这样做会选择性地抑制对我的警告,仅针对从
    覆盖加载的内容。当然,您可以对文件夹命名进行更多的选择。这也意味着我不必更改我的MATLAB系统文件中的任何内容,因此它将被本地化到我的用户帐户中,并在升级过程中保持不变(无论好坏,猴子补丁都是负责任的)

    要从我的覆盖中访问内置的
    ,我必须暂时在那里使用
    cd
    (否则覆盖将简单地称之为self)。因此,
    figure.m
    将如下所示:

    函数图=图(varargin)
    %调用原始图形函数
    old=pwd;
    cd(完整文件(matlabroot、“工具箱”、“matlab”、“图形”和“”);
    图=图(varargin{:});
    cd(旧版);
    % ...
    %你喜欢魔法吗
    结束
    
    我还不能发表评论,所以我将在这里进一步扩展Vivic给出的答案。一般过程保持不变,但它还有一些进一步的微调

  • 将覆盖函数figure.m放在当前MATLAB
    路径
    之外的文件夹中,例如
    /users/heidelberg/.MATLAB/\u重载
    。对我来说,tilde扩展是受支持的,但我不会依赖它。但是,您也可以将其放在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');
    
    这里的区别在于,如果管理员将警告设置为关闭,则不会意外地将其重新打开

  • 在图的实现中,在某个时候可能需要调用内置版本。Vicvic建议在目录中放一张
    cd
    ,但是还有一个MATLAB函数
    内置的
    ,它可以为您完成这项工作:

    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
    文件的目录中有一个子文件夹,称为
    \u重载
    。对我来说,这是
    /users/timm/Documents/MATLAB/\u重载
    。要轻松添加此文件夹,请使用以下脚本:

    文件
    /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中添加该目录,只要编辑并保存该目录中的函数,都会显示警告


    解决这个问题的一个简单方法是将重载函数放在。然后启动包。没有必要弄乱警告。

    使用lastwarn是个好主意,我没有想到这一点。但是,由于警告是在启动期间早期生成的(当包含my
    figure.m
    的目录添加到路径中时),向startup.m添加警告是不够的-我需要在设置MATLAB路径之前将其放置在全局matlabrc.m的开头。是的,我的Matlab安装并不是每次都显示这个警告,这很奇怪,但正如您所说,您可以在matalbrc.m中执行此操作。对于你的具体问题,我想你可以