関数ハンドルの作成
関数ハンドルとは
関数ハンドルは、関数への関連付けを格納する MATLAB® データ型です。関数を間接的に呼び出すことで、呼び出し位置によらずに関数を呼び出すことができます。関数ハンドルの一般的な使用には以下が含まれます。
関数の別の関数への引き渡し (通常、"関数を引数とする関数" と呼ばれる)。たとえば、関数を
integral
やfzero
などの積分関数や最適化関数に渡す場合です。コールバック関数の指定 (たとえば、UI イベントに応答したり、データ収集ハードウェアと相互作用するコールバック)。
プログラム ファイルに保存されているものではなくインラインで定義されている関数 (無名関数) へのハンドルの作成。
メイン関数外部からのローカル関数の呼び出し。
変数 h
が関数ハンドルかどうかは、isa
(h,'function_handle')
を使用して確認できます。
関数ハンドルの作成
関数のハンドルを作成するには、関数名の前に @
記号を付けます。たとえば、myfunction
という関数がある場合、以下のようにして f
という名前のハンドルを作成します。
f = @myfunction;
関数を直接呼び出すのと同じ方法で、ハンドルを使用して関数を呼び出します。たとえば、次のように定義された computeSquare
という名前の関数があるとします。
function y = computeSquare(x) y = x.^2; end
ハンドルを作成して関数を呼び出し、4 の二乗を計算します。
f = @computeSquare; a = 4; b = f(a)
b = 16
関数が入力を必要としない場合、小かっこ内を空にすることでその関数を呼び出せます。
h = @ones; a = h()
a = 1
小かっこがない場合、この代入により別の関数ハンドルが作成されます。
a = h
a = @ones
関数ハンドルは、別の関数に渡すことのできる変数です。たとえば、[0,1] の範囲で x2 の積分を計算します。
q = integral(f,0,1);
関数ハンドルはその絶対パスを格納するので、有効なハンドルがある場合は任意の場所から関数を呼び出すことができます。ハンドルの作成時には関数名だけが必要であり、関数へのパスを指定する必要はありません。
関数へのハンドルの作成時には、以下に留意してください。
名前の長さ — 関数名 (パッケージおよびクラスの名前を含む) の各部分は、
namelengthmax
で指定された数未満でなければなりません。そうなっていない場合、MATLAB は名前の長い部分を切り捨てます。スコープ — 関数ハンドルの作成時に関数がスコープ内になければなりません。したがって、関数は MATLAB パス上または現在のフォルダー内になければなりません。つまり、ローカル関数または入れ子関数へのハンドルの場合、関数は現在のファイル内になければなりません。
優先順位 — 同じ名前の関数が複数ある場合、MATLAB は関数呼び出しと同じ優先順位の規則を使用して関数ハンドルを定義します。詳細は、関数の優先順位を参照してください。
オーバーロード — 関数ハンドルが 1 つ以上の引数を使用して呼び出された場合、MATLAB が優先引数を決定します。優先引数がオブジェクトの場合、MATLAB は、そのオブジェクトのクラスに関数ハンドルの関連する関数と同じ名前をオーバーロードするメソッドがあるかどうかを判断します。ある場合、関連する関数の代わりに、オブジェクトのメソッドが呼び出されます。
無名関数
無名関数へのハンドルを作成できます。無名関数は、プログラム ファイルを必要としない 1 行で表現される MATLAB 関数です。関数 anonymous_function
の本体と、無名関数 arglist
への入力引数のコンマ区切りリストを定義して、無名関数へのハンドルを作成します。構文は、次のようになります。
h = @(arglist)anonymous_function
たとえば、数値の二乗を計算する無名関数へのハンドル sqr
を作成し、そのハンドルを使用して無名関数を呼び出します。
sqr = @(n) n.^2; x = sqr(3)
x = 9
詳細は、無名関数を参照してください。
関数ハンドルの配列
関数ハンドルを cell 配列または構造体配列に収集することで、関数ハンドルの配列を作成できます。たとえば、cell 配列を次のように使用します。
C = {@sin, @cos, @tan}; C{2}(pi)
ans = -1
または構造体配列を次のように使用します。
S.a = @sin; S.b = @cos; S.c = @tan; S.a(pi/2)
ans = 1
関数ハンドルの保存と読み込み
他の変数と同様にして、関数ハンドルを MATLAB に保存したり読み込んだりできます。つまり、関数 save
および load
を使用します。関数ハンドルを保存すると、MATLAB は絶対パス情報を保存します。関数のファイルがその場所にまだ存在している限り、MATLAB が到達できる任意の場所から関数を呼び出すことができます。ハンドルが作成された後にファイルの場所またはファイルの名前が変更されると、そのハンドルは無効になります。ハンドルが無効な場合、ファイルを読み込むときに MATLAB が警告を表示する場合があります。無効なハンドルを呼び出すと、MATLAB はエラーを発行します。
参考
str2func
| func2str
| functions
| isa
| function_handle