元の関数とまったく同じ名前の関数の周りにラッパーを作成できますか?既存の関数を同じ名前の新しい関数でラップする方法
これは、彼らがはい、これは可能ですが、それはハッキングのビットを必要とHow to interrupt MATLAB IDE when it hangs on displaying very large array?
元の関数とまったく同じ名前の関数の周りにラッパーを作成できますか?既存の関数を同じ名前の新しい関数でラップする方法
これは、彼らがはい、これは可能ですが、それはハッキングのビットを必要とHow to interrupt MATLAB IDE when it hangs on displaying very large array?
実際に代わり、あなたがする必要はありません答えるのを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
によって発見された機能のためにのみ動作という。そうでない人にとっては、スレイトンのアプローチが必要である可能性が高い。
しかし、そこにはたくさんの機能が組み込まれていないので、それらをすべて包み込みたいのです! –
@GuntherStruyf:なぜあなたはそれらのすべてを包み込みたいのですか?特に非組み込みのものは何ですか? – jmetz
職場では、私たちのmatlabのインストールは読み取り専用なので、ファイル自体を変更することはできません。そして、いつもmyfuninsteadを楽しく使うのは便利ではありません。特に、デフォルトの動作を改善しようとしている場合は特にそうです。実際のアプリケーション:[Daniel Kesslerの問題](http://stackoverflow.com/questions/11779511/how-to-interrupt-matlab-ide-when-it-hangs-on-displaying-very-large-array) –
機能に建てに渡される前に、ユーザが入力変数にいくつかの追加チェックをしたい状況で非常に有用であろう。いくつかの関数ハンドルをコピーする必要があります。
質問に記載されている例を使用して、入力変数のサイズをチェックし、大きすぎる変数のオープン操作をキャンセルできるユーザー定義関数に関数openvar
をラップする方法を示します。
また、これは、ユーザーがMatlab IDEの[ワークスペース]ペインで変数をダブルクリックしたときに機能します。
私たちは3つのことをする必要があります。
openvar
関数にハンドルを取得しopenvar
名をリダイレクト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;
を
シャドーされた関数へのハンドルを取得する方が簡単です。正確にはファイルパスから取得するだけです。あなたの解決策は何らかの初期化を必要とします( 'clear all'を使うたびに)。 [私の解決策](http://stackoverflow.com/a/11781650/1162609)は、パスとバックにcd'ingが必要ですが、それはすべてのハッカーです。私はまだ誰かがより良い方法を思い付くことを願っています:p –
私はあなたが他の質問に投稿した回答に同意します(http://stackoverflow.com/questions/11779511/how-to-interrupt-matlab-ide-when-it-hangs-on-displaying-very-large-配列)は、その質問slaytonには良いですが、一般的な質問はより良い答えを持っています - 下記を参照してください。 – jmetz