6

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

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

鉴于在我的情况下这是所需的行为,有什么方法可以停用此警告?

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

更新

正如 Aabaz 所提到的,您可以使用全局关闭此警告

warning off MATLAB:dispatcher:nameConflict

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

4

4 回答 4

4

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

PS:警告最终出于某种原因出现,我能够使用 lastwarn 和 warning 将其关闭。

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

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

于 2011-06-20T09:20:27.377 回答
2

我刚刚在 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
于 2015-02-20T09:48:01.567 回答
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. 在您的 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
    

    此外,使用varargoutandnargout保存任意数量的输出参数(现在可能无关紧要,但对于其他功能或未来版本可能很重要)。


注解

我更喜欢的一种方法是在存储我的startup.m文件的目录中有一个子文件夹,称为 eg _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');
于 2016-01-19T13:27:59.753 回答
1

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

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

于 2016-11-26T19:35:46.163 回答