2016-09-07 4 views
7

Matlabには、プロットする軸へのハンドルであるオプションの引数を取る多くのプロット関数が含まれています。ユーザ定義関数(varargin、inputParser)にオプションの引数を追加する方法は多くありますが、オプション引数は必須引数の後に来る必要がありますが、通常はmatlabのプロット関数はMatlab - plotのような関数のためのオプションのハンドル引数

plot(optional, mandatory, optional) 

つまり、オプションの引数は、必須の引数の前後に指定できます。

カスタムプロットタイプのこの動作を複製して、組み込みプロット関数と同じスタイルに従いたいとします。以下のユースケースは、単独の引数の数をチェックすることが望ましい行動を達成するには不十分であることを実証するために提示されています

x = [1:10]; 
y = x.^2; 
ax(1) = subplot(1, 2, 1); 
ax(2) = subplot(1, 2, 2); 

myplot(x, y);     %Mandatory 
myplot(x, y, 'r+');   %Mandatory, optional 
myplot(ax(1), x, y);   %Optional, mandatory 
myplot(ax(2), x, y, 'r+'); %Optional, mandatory, optional 

私の質問は、技術は、我々はこの動作をエミュレートするために使用することができるもの、ありますか?

答えて

4

vararginを入力とする関数を書くことができます。次に、引数の数を確認します。それが2(または機能に応じて)より小さい場合は、エラーまたは警告をキャストします。次に、入力パラメータのclassを確認します。

あなたの最初の入力のclass'matlab.graphics.axis.Axes'であれば、あなたの関数を呼び出す必要があります:plot(ax,___)。 2倍の場合は、plot(X,Y,LineSpec)の形式でなければなりません。これらの線に沿って

何かが

function [] = myplot(varargin) 

if nargin < 2 
    error('Minimum two input must be given'); % You probably want something other than an error. This was just an example. 
elseif nargin == 2 
    % Code for plotting 
    plot(x, y) 
elseif nargin == 3 
    if strcmp(class(varargin{1}),'matlab.graphics.axis.Axes') 
     ax1 = varargin{1}; 
     x = varargin{2}; 
     y = varargin{3}; 
     plot(ax1, x, y) 
    elseif isa(varargin{2}, 'double') && isa(varargin{3}, 'double') && isa(varargin{3}, 'char') 
     x = varargin{1}; 
     y = varargin{2}; 
     LineSpec = varargin{3}; 
    else ... 

PSを動作するはずです! x = varargin{1}などを行う必要はありません。これは、iftrueと評価された場合、それぞれのセル要素が表すものを示すためのものです。

「名前 - 値ペア引数」に進むことができます。入力引数のクラスがcharであり、パラメータ名以外を表すことができないかどうかを確認してください。パラメータ名の場合は、次の引数がパラメータ値であることがわかります。

+0

これはこれが行われた方法だと感じましたが、よりエレガントなものが可能であることを望んでいました。 – bhillam

+0

@bhillam私はこれでうまくいかないとは思わない? MATLABは関数のオーバーロードを許可しません。とにかく2つの関数を書く必要がありました。 – patrik

+0

多数の引数の組み合わせが可能な場合、非常に迅速に厄介になるコードの重複があります。残念ながら、これは使用される手法に関係なく問題になると思われます。 私はこの答えを受け入れました。なぜなら、Sam Robertsの答えのいくつかの要素が有用であるにもかかわらず、組み込みプロット関数と同じ虚偽の必須引数の前にオプションの引数を含める方法を扱っているからです。 – bhillam

7

私は通常、MATLABの一部であるプロット機能の多くでも使用されているこのようなパターン、使用:

function varargout = myplot(obj, varargin) 

    % Check the number of output arguments. 
    nargoutchk(0,1); 

    % Parse possible axes input. 
    [ax, args, ~] = axescheck(varargin{:}); %#ok<ASGLU> 

    % Get handle to either the requested or a new axis. 
    if isempty(ax) 
     hax = gca; 
    else 
     hax = ax; 
    end 

    % At this point, hax refers either to a specified axis, or 
    % to a fresh one if none was specified. args refers to the 
    % remainder of any arguments passed in varargin. 

    % Parse the rest of args 

    % Make the plot in hax 

    % Output a handle to the axes if requested. 
    if nargout == 1 
     varargout{1} = hax; 
    end 

end 

axescheckが文書化されていない機能です。あなたはこれを行うことで常に小さなリスクを冒していますが、MATLABには永遠に存在し、変わらず、MATLAB内の多くの非常に安定したプロット関数によって使用されています。

これは、最初の引数が軸のハンドルであるかどうかをチェックすることです。そうであれば、axがそのハンドルになり、残りの入力引数はargsになります。そうでない場合、axは空であり、argsにはすべての入力引数が含まれます。

希望に役立ちます!


編集:さらに詳しい情報はaxescheckです。

which axescheckedit axescheckと入力すると、axescheckの場所とソースコードが最初に表示されます。このようにして、あなたはそれが何をするかを正確に見ることができます。

構文は[AX, ARGS, NARGS] = AXESCHECK(ARG1, ARG2, ...)です。

まず、ARG1が軸のハンドルであるかどうかを確認します。入力引数のいずれかでパラメータ値のペアである場合にそうである場合、それは残りの引数(ARG2, ...)はARGSに戻され、AXとして返され、NARGSは第二narginマイナス1

の値だ、それはチェックパラメータParent。その場合は、パラメータParentを持つすべてのパラメータと値のペアがリストから削除されます。指定された軸はAXに、残りの引数はARGSに、NARGSnarginの値から削除された引数の数を引いた値になります。

ない軸が上記のいずれかの方法で指定されていない場合、その後AXARGSがちょうど入力引数であり、そしてNARGSnarginの値であり、空です。

axescheckは、古いスタイル(ハンドルグラフィックス1)のダブルハンドル、およびクラスmatlab.graphics.axis.Axesの新しいスタイル(ハンドルグラフィックス2)ハンドルのいずれかと一緒に機能します。

また、指定されたハンドルが削除されたオブジェクトのハンドルであるかどうかをチェックし、存在する場合はエラーをスローします。

これは、多くの組み込みMATLABプロット関数で広く使用されています。たとえば、hist.m, polar.m, surfl.m, bar3.m, comet.m, pie.mなどを参照してください。

+0

この回答は有望ですが、文書化されていない軸検査機能に関する追加情報を追加することで改善できる可能性があります。例えばAxcheck(varargin {:})はisa(varargin {1}、 'matlab.graphics.axis.Axes')とどう違うのですか? – bhillam

+1

@bhillam 'axescheck'の詳細については私の編集を見てください。 –

+0

私はいつも1つの答えを選ぶだけで悪いと感じています。 – bhillam

関連する問題