ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

関数ハンドルの作成

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

関数ハンドルとは

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

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

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

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

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

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

関数ハンドルの作成

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

f = @myfunction;

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

function y = computeSquare(x)
y = x.^2;
end

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

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 は関数呼び出しと同じ優先順位の規則を使用して関数ハンドルを定義します。詳細は、関数の優先順位を参照してください。

  • オーバーロード — 指定した関数が MATLAB の基本クラスではないクラスの関数をオーバーロードする場合、その関数は作成時に関数ハンドルに関連付けられません。代わりに、MATLAB は入力引数を考慮し、評価時に呼び出す実装を決定します。

無名関数

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

h = @(arglist)anonymous_function

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

sqr = @(n) n.^2;
x = sqr(3)
x =

     9

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

関数ハンドルの配列

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

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 はエラーを発行します。

参考

| | |

関連する例

詳細

この情報は役に立ちましたか?