6

元の関数とまったく同じ名前の関数のラッパーを作成することは可能ですか?

これは、入力変数が組み込み関数に渡される前に、ユーザーが追加のチェックを実行したい場合に非常に便利です。

4

3 に答える 3

11

実際には、slaytonの答えの代わりに、を使用する必要はありませんopenvar。matlab関数と同じ名前の関数を定義すると、その関数がシャドウされます(つまり、代わりに呼び出されます)。

その後、独自の関数を再帰的に呼び出さないようにするには、を使用してラッパー内から元の関数を呼び出すことができますbuiltin

例えば

outputs = builtin(funcname, inputs..);

rand.m名前が付けられ、matlabパスにある簡単な例:

function out = main(varargin)
disp('Test wrapping rand... calling rand now...');
out = builtin('rand', varargin{:});

これは、によって検出された関数に対してのみ機能することに注意builtinしてください。そうでない人にとっては、slaytonのアプローチがおそらく必要です。

于 2012-08-02T16:35:01.407 に答える
3

はい、これは可能ですが、少しハッキングする必要があります。一部の関数ハンドルをコピーする必要があります。

openvar質問で提供されている例を使用して、入力変数のサイズをチェックし、ユーザーが大きすぎる変数のオープン操作をキャンセルできるようにするユーザー定義関数で関数をラップする方法を示します。

さらに、ユーザーが Matlab IDE のワークスペース ペインで変数をダブルクリックすると、これが機能するはずです。

3 つのことを行う必要があります。

  1. openvar元の関数のハンドルを取得する
  2. を呼び出すラッパー関数を定義するopenvar
  3. openvar元の名前を新しい関数にリダイレクトします。

例の機能

function openVarWrapper(x, vector)

    maxVarSize = 10000;
    %declare the global variable
    persistent openVarHandle; 

    %if the variable is empty then make the link to the original openvar
    if isempty(openVarHandle)
        openVarHandle = @openvar;
    end

    %no variable name passed, call was to setup connection
    if narargin==0
        return;
    end


    %get a copy of the original variable to check its size
    tmpVar = evalin('base', x);        

    %if the variable is big and the user doesn't click yes then return
    if prod( size( tmpVar)) > maxVarSize
        resp = questdlg(sprintf('Variable %s is very large, open anyway?', x));
        if ~strcmp(resp, 'Yes')
            return;
        end
    end

    if ischar(x) && ~isempty(openVarHandle);
        openVarHandle(x);
     end
 end

この関数が定義されたら、スクリプトを実行するだけです。

  • 指定された変数をクリアしますopenvar
  • openVarWrapperスクリプトを実行して接続をセットアップします
  • 原稿openVarを指すopenVarWrapper

スクリプト例:

clear openvar;
openVarWrapper;
openvar = @openVarWrapper;

最後に、すべてをクリーンアップしたい場合は、次のように呼び出すだけです。

clear openvar;
于 2012-08-02T16:27:11.677 に答える