[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

13.2 複数の戻り値

多くの他のコンピュータ言語とは異なり,Octaveでは,1つ以上の値を返す関数 が定義できるようになっています。複数の値を返す関数を定義するための文法 は,以下のようなものです。

 
function [ret-list] = name (arg-list)
  body
endfunction

ここでnamearg-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つの値は単一の配列の要素として返されることになり ます。しかし,これが常に可能であったり便利だったりするわけではありま せん。返される値は,整合性のある次元でないこともあります。また,個々 の返り値に別個の名前を与えることは,しばしば好ましいものです。

関数が呼ばれるたびにnarginをセットすることに加え,Octaveは, nargoutを,返されると期待される値の数に初期化します。これは, 関数のユーザがリクエストした値の数に依存して,異なる挙動をするような 関数を書くことができるようにします。組み込み変数ansへの暗黙的 な代入は,出力引数のカウントにおいて,判断されません。ゆえに, nargoutの値はゼロになります。

svdlu関数は,nargoutの値によって異なる挙動を する組み込み関数の例です。

ある戻り値のみをセットする関数を書くことが可能です。たとえば,以下ある関数

 
function [x, y, z] = f ()
  x = 1;
  z = 2;
endfunction

について,以下のように呼び出すとします。

 
[a, b, c] = f ()

その結果は,

 
a = 1

b = [](0x0)

c = 2

であり,組み込み変数warn_undefined_return_valuesがゼロでない ならば,警告が発生します。

Built-in Function: nargout ()
Built-in Function: nargout (fcn_name)

ある関数の内部で,呼び出し側が受け取ことを期待する値の数を返す。もしオプ ション引数fcn_nameを付けて呼び出すならば,その関数が返すことのでき る戻り値の最大数を返す。もしその関数が不定数の戻り値を返すならば,-1 を返す。

たとえば,

 
f ()

は,関数fの内部ではnargoutが0になり,また,

 
[s, t] = f ()

この関数fの内部では,nargoutが2となる。

トップレベルでは,nargoutは定義されない。

Built-in Variable: warn_undefined_return_values

もしwarn_undefined_return_valuesがゼロでないならば,ある関数が 期待される戻り値のリストにおいて1つでも値が定義されていないときに, 警告を表示する。

Function File: nargchk (nargin_min, nargin_max, n)

もしnnargin_minからnargin_maxまでの範囲にあるならば, 空行列を返す。そうでなければ,nが大きすぎるか小さすぎるかどうかを 示すメッセージを返す。

この関数は,関数に与えた引数の数が,受け入れられる範囲内にあることを 確かめるために便利である。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]

This document was generated on July, 20 2006 using texi2html 1.76.