11.6 Variable-length Argument Lists

Last-modified: 2025-03-22 (土) 21:24:46

11.6 可変長引数リスト

関数を定義するときに、入力引数の数がわからない場合があります。例として、すべての入力引数のうち最小の値を返す関数を考えてみましょう。例:

a = smallest (1, 2, 3);
b = smallest (1, 2, 3, 4);

この例では、との両方aが1になります。smallest関数 bの書き方の一つは

function val = smallest (arg1, arg2, arg3, arg4, arg5)
 body
endfunction

次に、 の値を使用して、narginどの入力引数を考慮する必要があるかを決定します。このアプローチの問題点は、限られた数の入力引数しか処理できないことです。

varargin関数のパラメータリストの最後に特別なパラメータ名が表示されている場合は、関数が可変数の入力引数を取ることを示します。varargin関数の使用法は次のようになります。

function val = smallest (varargin)
 body
endfunction

関数本体では、入力引数は変数を介してアクセスできますvarargin。この変数は、すべての入力引数を含むセル配列です。セル配列の操作の詳細については、セル配列を参照してください。関数smallestは次のように定義できます。

function val = smallest (varargin)
 val = min ([varargin{:}]);
endfunction

この実装は任意の数の入力引数を処理しますが、問題に対する非常に単純な解決策でもあります。

のもう少し複雑な例は、すべての入力引数を出力するvarargin関数です print_arguments。このような関数は次のように定義できます。

function print_arguments (varargin)
 for i = 1:length (varargin)
   printf ("Input argument %d: ", i);
   disp (varargin{i});
 endfor
endfunction

この関数は次のような出力を生成します

print_arguments (1, "two", 3);
    -| Input argument 1:  1
    -| Input argument 2: two
    -| Input argument 3:  3

: [reg, prop] = parseparams (params)

: [reg, var1, …] = parseparams (params, name1, default1, …)

regには、最初の文字列要素までのparamのセル要素を返し、 propには、最初の文字列要素から始まる残りのすべての要素を返します。

例えば:

[reg, prop] = parseparams ({1, 2, "linewidth", 10})
reg =
{
 [1,1] = 1
 [1,2] = 2
}
prop =
{
 [1,1] = linewidth
 [1,2] = 10
}

parseparams 関数は、通常の数値引数を、 vararginセル配列のプロパティ/値のペアとして指定された追加の引数から分離するために使用できます。

呼び出しの 2 番目の形式では、使用可能なオプションが、名前と値のペアとして指定されたデフォルト値とともに直接指定されます。パラメータが名前と値のペアを形成しない場合、または使用可能なオプションのいずれにも一致しないオプションが発生した場合は、エラーが発生します。

m ファイル関数から呼び出されると、エラーの前に呼び出し元関数の名前が付けられます。

オプションの一致では大文字と小文字は区別されません。

See also: varargin, inputParser.