ドキュメンテーション センター

  • 評価版
  • 製品アップデート

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

function_handle (@)

関数の間接的な呼び出しに使用するハンドル

構文

handle = @functionname
handle = @(arglist)anonymous_function

説明

handle = @functionname は、指定した MATLAB® 関数のハンドルを返します。

関数ハンドルとは、関数を間接的に呼び出すための手段を提供する MATLAB の値です。呼び出しの中で関数ハンドルを別の関数 (通常、function 関数 と呼ばれる) に渡すことができます。さらに、後で使用できるように (たとえば、Handle Graphics のコールバックとして) データ構造内に関数ハンドルを保存することもできます。関数ハンドルは、標準の MATLAB データ型の 1 つです。

関数ハンドルの作成時には、関数は MATLAB パス上およびハンドルを作成するコードの現在の領域内になければなりません。たとえば、ローカル関数のハンドルは、そのローカル関数を定義するファイル内でのみ作成できます。この条件は、関数ハンドルの計算時には適用されません。たとえば、関数ハンドルを使用して、個別の (スコープ外) ファイルからローカル関数を実行できます。これには、ハンドルがローカル関数 (スコープ内) で作成されている必要があります。

handle = @(arglist)anonymous_function は、「無名関数」を作成して、その関数の handle を返します。関数の本体 (丸かっこの右側) は、単一の MATLAB ステートメントまたはコマンドです。arglist は、入力引数のコンマ区切りリストです。関数を実行するには、関数ハンドル handle を使用して関数を呼び出します。

例 1 — 指定された関数のハンドルの作成

この例では、関数 humps の関数ハンドルを作成し、これを変数 fhandle に割り当てます。

fhandle = @humps;

引数を渡す場合と同じ方法で、ハンドルを他の関数に渡します。この例では、作成した関数ハンドルを関数 fminbnd に渡した後、区間 [0.3, 1] で最小化します。

x = fminbnd(fhandle, 0.3, 1)
x =
    0.6370

関数 fminbnd は、@humps 関数ハンドルを評価します。fminbnd ファイルの内容の一部を以下に示します。1 行目で、funfcn 入力パラメーターは、渡された関数ハンドル @humps を受け取ります。113 行のステートメントは、ハンドルを評価します。

1    function [xf,fval,exitflag,output] = ...
         fminbnd(funfcn,ax,bx,options,varargin)
            .
            .
            .
113  fx = funfcn(x,varargin{:});

例 2 — 無名関数のハンドルの作成

下記のステートメントは、数値のニ乗を計算する無名関数を作成します。この関数を呼び出すと、MATLAB は渡された値を変数 x に割り当て、x を使って x.^2 式を計算します。

sqr = @(x) x.^2;

@ 演算子は、この関数に関数ハンドルを作成し、ハンドルを出力変数 sqr に割り当てます。他の関数ハンドルと同様に、関数を実行するには、ハンドルを含む変数の後に、コンマ区切りの引数リストを丸かっこ内に指定します。その構文は以下のとおりです。

fhandle(arg1, arg2, ..., argN)

上で定義した関数 sqr を実行するには、以下のように入力します。

a = sqr(5)
a =
   25

sqr は関数ハンドルであるため、引数リストにして他の関数に渡すことができます。ここで紹介したコードは、無名関数 sqr を MATLAB 関数 integral に渡して、0 から 1 まで積分します。

integral(sqr, 0, 1)
ans =
   0.3333

例 3 — 関数ハンドルの配列の使用

この例では、関数ハンドル S の構造体配列を作成した後、structfun を使用した 1 つの操作で、配列の各ハンドルを linspace 計算の出力に適用します。

S.a = @sin;  S.b = @cos;  S.c = @tan;
structfun(@(x)x(linspace(1,4,3)), S, 'UniformOutput', false)
ans = 
    a: [0.8415 0.5985 -0.7568]
    b: [0.5403 -0.8011 -0.6536]
    c: [1.5574 -0.7470 1.1578]

詳細

すべて展開する

ヒント

関数ハンドルは、標準の MATLAB データ型です。そのため、他の MATLAB データ型と同じ方法で、関数ハンドルの操作や運用ができます。これには、構造体やセル配列の中での関数ハンドルの使用も含まれます。

S.a = @sin;  S.b = @cos;  S.c = @tan;
C = {@sin, @cos, @tan};

ただし、標準行列や関数ハンドルの配列はサポートされません。

A = [@sin, @cos, @tan];        % This is not supported

オーバーロード関数でない関数、ローカル関数およびプライベート関数の場合、関数ハンドルは @functionname 構文内に指定された関数を参照します。ハンドルを使用してオーバーロード関数を評価する場合、ハンドルを評価する引数により、MATLAB がディスパッチする実際の関数が決定されます。

変数 h が関数ハンドルかどうかを調べるには、関数 isa(h, 'function_handle') を使用します。

参考

| | |

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