11.4 複数の戻り値
他の多くのコンピュータ言語とは異なり、Octaveでは複数の値を返す関数を定義することができます。複数の値を返す関数を定義する構文は次のとおりです。
function [ret-list] = name (arg-list) body endfunction
ここで、 name、arg-list、body は前と同じ意味を持ち、ret-list は関数から返される値を保持する変数名のコンマ区切りのリストです。戻り値のリストには少なくとも 1 つの要素が必要です。ret-list に要素が 1 つしかない場合、この形式のfunctionステートメントは前のセクションで説明した形式と同等です。
以下は、ベクトルの最大要素とベクトル内でその要素が最初に出現するインデックスの 2 つの値を返す関数の例です。
function [max, idx] = vmax (v)
idx = 1;
max = v (idx);
for i = 2:length (v)
if (v (i) > max)
max = v (i);
idx = i;
endif
endfor
endfunction
この特定のケースでは、2 つの値を 1 つの配列の要素として返すこともできますが、それが常に可能であったり便利であるとは限りません。返される値の次元に互換性がない場合があり、個々の戻り値に異なる名前を付けることが望ましい場合がよくあります。
nthargoutこの関数を使用すると、戻り値の一部のみを取得したり、セル配列で複数の戻り値を一度に取得したりできます。 「セル配列オブジェクト」を参照してください。
: arg = nthargout (n, fcn, …)
: arg = nthargout (n, ntot, fcn, …)
関数ハンドルまたは文字列fcnで指定された関数のn番目の出力引数を返します。
追加の引数はfcnに直接渡されます。 fcnを呼び出す引数の合計数はntotで渡すことができます。デフォルトではntotはnです。入力nは出力のインデックスのベクトルにすることもできます。その場合、出力は要求された出力引数のセル配列になります。
の意図された使用法は、nthargout中間変数を避けることです。たとえば、行列の最大要素のインデックスを見つける場合、次の2つのnthargout
m = magic (5);
cell2mat (nthargout ([1, 2], @ind2sub, size (m),
nthargout (2, @max, m(:))))
⇒ 5 3
次の行と完全に同等です。
m = magic (5); [~, idx] = max (M(:)); [i, j] = ind2sub (size (m), idx); [i, j] ⇒ 5 3
次のコードが示すように、すべての出力引数を 1 つのセル配列に集めておくと便利な場合もあります。
USV = nthargout ([1:3], @svd, hilb (5));
See also: nargin, nargout, varargin, varargout, isargout.
nargin関数が呼び出されるたびに設定することに加えて、Octave はnargout返されると予想される値の数を自動的に初期化します。これにより、関数のユーザーが要求した値の数に応じて異なる動作をする関数を記述できます。組み込み変数への暗黙的な割り当てはans出力引数の数には含まれないため、の値はnargout0 になる場合があります。
関数svdとhist関数は、 の値に応じて異なる動作をする組み込み関数の例です nargout。たとえば、 はhist出力変数なしで呼び出されるとヒストグラムを描画しますが、出力付きで呼び出されるとプロットを作成せずに頻度数やビンの中心を返します。
いくつかの戻り値のみを設定する関数を書くことも可能です。例えば、関数を呼び出すと
function [x, y, z] = f () x = 1; z = 2; endfunction
として
[a, b, c] = f ()
生成:
a = 1 b = [](0x0) c = 2
警告とともに。
: n = nargout ()
: n = nargout (fcn)
v関数からの出力引数の数を報告します。
関数内から呼び出され、呼び出し元が受け取ると予想される値の数を返します。最上位レベルでは、nargout引数がない場合、未定義となり、エラーが発生します。
オプションの引数fcn (関数名またはハンドル) を指定して呼び出された場合は、関数が生成できる宣言された出力値の数を返します。
最終出力引数がvarargoutの場合、返される値は負になります。
例えば、
f ()
nargout関数内で0を返しf、
[s, t] = f ()
nargout関数内で 2 を返しますf。
2番目の用法では、
nargout (@histc) # または文字列入力を使用したnargout ("histc")
histcは2つの出力を持つ ため2を返しますが、
nargout (@imread)
imread出力が 2 つあり、 2 番目が varargoutであるため、 -2 を返します。
プログラミング ノート。 nargout組み込み関数では機能せず、すべての匿名関数に対して -1 を返します。
See also: nargin, varargout, isargout, nthargout.