Programming and Data Types | ![]() ![]() |
転送する引数の数を可変にする
関数varargin
と varargout
は、任意の数の入力引数、または任意の数の出力引数を関数に自由に設定させることができます。この節では、これらの関数の使い方を説明します。
MATLABは、セル配列内に指定した全ての入力引数をパックします。これは、配列要素の代わりに、セルから構成されるMATLAB配列の特別な種類です。各々のセルは、任意のサイズのデータ、または、任意の種類のデータを含むことができます。すなわち、あるものは数値データベクトルで、同じ配列の中の他のものは文字データ配列と言うように設定できます。出力引数に対して、関数コードは、セル配列にパックしなければならないので、MATLABは引数を呼び出し側に出力します。
つぎの例題の関数は、任意の数の2要素ベクトルを受け入れ、ラインを使って、これらを繋げることができます。
function testvar(varargin) for i = 1:length(varargin) x(i) = varargin{i}(1); % Cell array indexing y(i) = varargin{i}(2); end xmin = min(0,min(x)); ymin = min(0,min(y)); axis([xmin fix(max(x))+3 ymin fix(max(y))+3]) plot(x,y)
この方法をコード化して、関数testvar
は、つぎのような例を使って種々の入力を処理しましょう。
testvar([2 3],[1 5],[4 8],[6 5],[4 2],[2 3]) testvar([-1 0],[3 -5],[4 2],[1 1])
vararginの内容を分解
varargin
は、セル配列の中のすべての入力引数を含んでいるので、データを抜き出すためにセル配列にインデックスを付けて使う必要があります。例えば、
y(i) = varargin{i}(2);
インデックス付きのセル配列は、2つのサブスクリプト成分をもっています。
上のコードの中で、インデックス付き式{i}
は、varargin
のi
番目のセルにアクセスします。式(2)
は、セルの内容の2番目の要素を表現します。
varargoutの内容をパック
任意の出力引数の数を受け入れるので、すべての出力をvarargout
セル配列にパックしなければなりません。関数がいくつの出力引数を読み込んでいるのかを決めるためにnargoutを使います。例えば、つぎのコードは、2列の入力配列を受け入れます。最初の列はx
座標を表し、2番目の列はy
座標を表します。これは、配列を[xi
yi]
ベクトルに分離し、前の例題の関数testvar
に転送します。
function [varargout] = testvar2(arrayin) for i = 1:nargout varargout{i} = arrayin(i,:) % Cell array assignment end
for
ループの内部の代入ステートメントは、セル配列の代入シンタックスを使います。ステートメントの左辺、セル配列は、データがセルの内部に入ることを示す中括弧を使ってインデックスを示しています。セル配列代入での完全な情報に対しては、"構造体とセル配列"を参照してください。
a = {1 2;3 4;5 6;7 8;9 0}; [p1,p2,p3,p4,p5] = testvar2(a);
引数リスト内の vararginと varargout
varargin
、または、 varargout
は、引数リストの中で、必要な入力変数、または、必要な変数に続けて、最後に設定します。これは、関数が読み込むために必要な引数をまず設定しなければならないからです。例えば、つぎの関数宣言ラインは、varargin
とvarargout
の正しい位置を示しています。
function [out1,out2] = example1(a,b,varargin) function [i,j,varargout] = example2(x1,y1,x2,y2,flag)
![]() |
Function引数の数のチェック | ローカル変数とグローバル変数 | ![]() |