主要内容

このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。

関数ハンドルの作成

名前付き関数および無名関数への関数ハンドルを作成できます。他の変数と同様にして,複数の関数ハンドルを配列に格納し,それらを保存したり読み込んだりできます。

関数ハンドルとは

関数ハンドルは,関数への関連付けを格納するMATLAB®データ型です。関数を間接的に呼び出すことで、呼び出し位置によらずに関数を呼び出すことができます。関数ハンドルの一般的な使用には以下が含まれます。

  • 関数の別の関数への引き渡し(通常,“関数を引数とする関数”と呼ばれる)。たとえば,関数を积分fzeroなどの積分関数や最適化関数に渡す場合です。

  • コールバック関数の指定(たとえば,UIイベントに応答したり,データ収集ハードウェアと相互作用するコールバック)。

  • プログラムファイルに保存されているものではなくインラインで定義されている関数(無名関数)へのハンドルの作成。

  • メイン関数外部からのローカル関数の呼び出し。

変数hが関数ハンドルかどうかは,isa(h, function_handle)を使用して確認できます。

関数ハンドルの作成

関数のハンドルを作成するには,関数名の前に記号を付けます。たとえば,myfunctionという関数がある場合,以下のようにしてfという名前のハンドルを作成します。

f = @myfunction;

関数を直接呼び出すのと同じ方法で,ハンドルを使用して関数を呼び出します。たとえば,次のように定義されたcomputeSquareという名前の関数があるとします。

函数y = computeSquare(x) y = x.^2;结束

ハンドルを作成して関数を呼び出し,4の二乗を計算します。

f = @computeSquare;= 4;b = f ()
b = 16

関数が入力を必要としない場合,小かっこ内を空にすることでその関数を呼び出せます。

h = @ones;一个= h ()
一个= 1

小かっこがない場合,この代入により別の関数ハンドルが作成されます。

一个= h
一个= @ones

関数ハンドルは,別の関数に渡すことのできる変数です。たとえば,[0,1]の範囲でx2の積分を計算します。

q =积分(f (0, 1);

関数ハンドルはその絶対パスを格納するので,有効なハンドルがある場合は任意の場所から関数を呼び出すことができます。ハンドルの作成時には関数名だけが必要であり,関数へのパスを指定する必要はありません。

関数へのハンドルの作成時には,以下に留意してください。

  • 名前の長さ——関数名(パッケージおよびクラスの名前を含む)の各部分は,namelengthmaxで指定された数未満でなければなりません。そうなっていない場合,MATLABは名前の長い部分を切り捨てます。

  • スコープ——関数ハンドルの作成時に関数がスコープ内になければなりません。したがって,関数はMATLABパス上または現在のフォルダー内になければなりません。つまり,ローカル関数または入れ子関数へのハンドルの場合,関数は現在のファイル内になければなりません。

  • 優先順位——同じ名前の関数が複数ある場合,MATLABは関数呼び出しと同じ優先順位の規則を使用して関数ハンドルを定義します。詳細は,関数の優先順位を参照してください。

  • オーバーロード——関数ハンドルが1つ以上の引数を使用して呼び出された場合,MATLABが優先引数を決定します。優先引数がオブジェクトの場合,MATLABは,そのオブジェクトのクラスに関数ハンドルの関連する関数と同じ名前をオーバーロードするメソッドがあるかどうかを判断します。ある場合,関連する関数の代わりに,オブジェクトのメソッドが呼び出されます。

無名関数

無名関数へのハンドルを作成できます。無名関数は、プログラム ファイルを必要としない 1 行で表現される MATLAB 関数です。関数anonymous_functionの本体と,無名関数arglistへの入力引数のコンマ区切りリストを定義して,無名関数へのハンドルを作成します。構文は,次のようになります。

h = @ anonymous_function (arglist)

たとえば,数値の二乗を計算する無名関数へのハンドルsqrを作成し,そのハンドルを使用して無名関数を呼び出します。

SQR = @(n) n.平方;x = sqr (3)
x = 9

詳細は,無名関数を参照してください。

関数ハンドルの配列

関数ハンドルを细胞配列または構造体配列に収集することで,関数ハンドルの配列を作成できます。たとえば、细胞配列を次のように使用します。

C = {@sin, @cos, @tan};C{2}(π)
ans = 1

または構造体配列を次のように使用します。

s.a. = @sin;mit获得= @cos;南卡罗来纳州= @tan;s.a.(π/ 2)
ans = 1

関数ハンドルの保存と読み込み

他の変数と同様にして,関数ハンドルをMATLABに保存したり読み込んだりできます。つまり,関数保存および负载を使用します。関数ハンドルを保存しても、MATLAB はパス情報を保存しません。関数ハンドルの読み込み時にその関数ファイルが既にパス上になければ、そのハンドルは無効です。ハンドルが作成された後にファイルの場所またはファイルの名前が変更されると、そのハンドルは無効になります。ハンドルが無効な場合、ファイルを読み込むときに MATLAB が警告を表示する場合があります。無効なハンドルを呼び出すと、MATLAB はエラーを発行します。

参考

||||

関連する例

詳細