6

hereで説明されているよう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

関数オーバーロードを含むディレクトリを検索パスに追加すると、ディレクトリが startup.m に追加されているかどうかに関係なく、そのディレクトリ内の関数が編集および保存されるたびに警告が表示されます。

これを解決する簡単な方法は、オーバーロード関数をパッケージに入れることです。次に、起動時にパッケージをインポートします。警告をいじる必要はありません。

于 2016-11-26T19:35:46.163 に答える
1

まだコメントできないので、vicvicvicからの回答をここでさらに拡張します。一般的なプロセスは同じままですが、さらに微調整がいくつかあります。

  1. オーバーライド関数の figure.m を、現在の MATLABpathにないフォルダーに配置します/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はディレクトリにa を提案しcdましたが、MATLAB function もあり、builtinその仕事をします:

    function fig = figure(varargin)
    % overload function
    
    % call builtin figure
    varargout = cell(1, nargout);
    [varargout{:}] = builtin('figure', varargin{:});
    
    % do you magic here
    % ...
    
    end
    

    また、varargoutandを使用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');
于 2016-01-19T13:27:59.753 に答える