9.1 Calling a Function by its Name

Last-modified: 2025-03-22 (土) 21:14:45

9.1 関数を名前で呼び出す

このfeval関数を使用すると、関数名を含む文字列から関数を呼び出すことができます。これは、ユーザー提供の関数を呼び出す必要がある関数を作成するときに便利です。このfeval関数は、呼び出す関数名を最初の引数として受け取り、残りの引数は関数に渡されます。

feval 次の例は、ニュートン法を使用して 1 つの変数のユーザー指定関数の根を見つける 単純な関数です。

function result = newtroot (fname, x)
# usage: newtroot (fname, x)
#
#   fname : a string naming a function f(x).
#   x     : initial guess
 delta = tol = sqrt (eps);
 maxit = 200;
 fx = feval (fname, x);
 for i = 1:maxit
   if (abs (fx) < tol)
     result = x;
     return;
   else
     fx_new = feval (fname, x + delta);
     deriv = (fx_new - fx) / delta;
     x = x - fx / deriv;
     fx = fx_new;
   endif
 endfor
 result = x;
endfunction

これは、ユーザー提供の関数を呼び出す例に過ぎず、あまり真剣に受け止めるべきではないことに注意してください。より堅牢なアルゴリズムを使用することに加えて、本格的なコードでは、すべての引数の数と型をチェックし、提供された関数が実際に関数であることを確認するなどします。数値オブジェクトの述語のリストについては、「数値オブジェクトの述語」を参照してください。関数の説明については、 「変数の状態」をexist参照してください。

: retval = feval (name, …)
nameという名前の関数を評価します。

最初の引数以降の引数は、指定された関数への入力として渡されます。たとえば、

feval ("acos", -1)
    ⇒ 3.1416

acos-1引数 ' で関数を呼び出す-。

この関数は、fevalあらゆる種類の関数ハンドルでも使用できます (関数ハンドルを参照)。歴史的には、feval文字列でユーザー指定の関数を呼び出す唯一の方法でしたが、よりクリーンな構文を提供するため、関数ハンドルが現在では好まれています。たとえば、

f = @exp;
feval (f, 1)
   ⇒ 2.7183
f (1)
   ⇒ 2.7183

これらは、 fによって参照される関数を呼び出す同等の方法です。fが関数ハンドル、文字列内の関数名、またはインライン関数のいずれであるかを事前に予測できない場合はfeval、代わりに を使用できます。

runユーザパス上に必ずしも存在しないユーザスクリプトファイルを呼び出すための 同様の機能が存在する。

: run script

: run ("script")

現在のワークスペースで スクリプトを実行します。

Octaveのロードパスで指定されたディレクトリにあり、拡張子が.mは、名前を入力するだけで実行できます。ロード パス上にないスクリプトの場合は、 を使用しますrun。

ファイル名スクリプトは、裸のファイル名、完全修飾ファイル名、相対ファイル名、ファイル拡張子の有無にかかわらず指定できます。拡張子が指定されていない場合、Octaveは最初に.m 拡張子のないスクリプト名に戻る前に、拡張子を削除します。

実装上の注意:スクリプトにパス コンポーネントが含まれている場合、 run最初に作業ディレクトリを スクリプトが見つかったディレクトリに変更します。次に、スクリプトが実行されます。最後に、スクリプトがディレクトリを明示的に変更していない限り、run 元の作業ディレクトリに戻ります。

See also: path, addpath, source.