主要内容

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

無名関数

無名関数とは

無名関数はプログラムファイルには“保存されません”が,データ型がfunction_handleの変数に関連付けられている関数です。無名関数は複数の入力を受け入れることができ、1 つの出力を返します。実行可能ステートメントは 1 つしか含むことができません。

たとえば,数値の二乗を計算する無名関数のハンドルを作成します。

@(x) x.^2;

変数sqrは関数ハンドルです。演算子でハンドルを作成し,演算子の直後にある小かっこ()に関数入力引数を含めます。この無名関数は1つの入力xを受け取り,二乗する値を格納するxと同じサイズの配列を,1つの出力として暗黙的に返します。

入力引数を標準の関数に渡すように値を関数ハンドルに渡して,特定の値(5)の二乗を計算します。

一个= sqr (5)
= 25

多くのMATLAB®関数は関数ハンドルを入力として受け取るので,関数を値の範囲で評価できます。ハンドルは,無名関数またはプログラムファイル内の関数に対して作成できます。無名関数を使用する利点は、簡単な定義のみが必要な関数に対してファイルを編集したり保守する必要がないことです。

たとえば,関数ハンドルを関数积分に渡し,関数sqr0から1までの積分を計算します。

q =积分(sqr 0 1);

ワークスペースで変数を作成して無名関数を保存する必要はありません。その代わり,式の中で一時的な関数ハンドルを,以下の関数积分の呼び出しのように作成できます。

Q =积分(@(x) x.^2,0,1);

式内の変数

関数ハンドルは,式のほかに,式の評価に必要な変数も保存できます。

たとえば,係数一个bおよびcを必要とする無名関数のハンドルを作成します。

一个= 1.3;b = 2;c = 30;抛物线= @(x) a*x。^2 + b*x + c;

抛物线の作成時に一个bおよびcを使用できるので,関数ハンドルはこれらの値を取り込みます。関数ハンドル内の値は、変数をクリアしてもそのまま存続します。

清晰的一个bcx = 1;y =抛物线(x)
y = 31.5000

係数に異なる値を指定するには,新しい関数ハンドルを作成しなければなりません。

一个= -3.9;b = 52个;c = 0;抛物线= @(x) a*x。^2 + b*x + c;x = 1;y =抛物线(1)
y = 48.1000

関数ハンドルと関連値を垫ファイルに保存して,関数保存负载を使用して後続のMATLABセッションで読み込むことができます。

保存myfile.mat抛物线

無名関数を作成する場合は,明示的な変数のみを使用してください。無名関数が引数リストまたは本体で明示的に参照されていない変数または入れ子関数にアクセスする場合、その関数を呼び出すと MATLAB はエラーをスローします。暗黙的な変数や、関数の暗黙的な呼び出しは、多くの場合evalevalinassigninおよび负载などの関数で発生します。無名関数の本体では、これらの関数の使用は避けてください。

複数の無名関数

無名関数の式に,別の無名関数を含めることができます。これは,値の範囲で評価している関数に異なるパラメーターを渡すときに便利です。たとえば,次の等式

は2つの無名関数を組み合わせることにより,cの値が変更されても解くことができます。

G = @(c)(积分(@(x) (x.²+ c*x + 1),0,1))

このステートメントを導き出すには,次の手順に従います。

  1. 無名関数として被積分関数を記述します。

    @(x) (x.^2 + c*x + 1)
  2. 関数ハンドルを积分に渡して0 ~ 1で関数を評価します。

    积分(@(x) (x.^2 + c*x + 1),0,1)
  3. 式全体に無名関数を作成し,cに値を指定します。

    G = @(c)(积分(@(x) (x.²+ c*x + 1),0,1))

最後の関数を使うと,任意のcの値に対して式を解くことができます。以下に例を示します。

g (2)
ans = 2.3333

入力のない関数

関数に入力が不要な場合,無名関数を定義するときおよび呼び出すときに空の小かっこを使用します。以下に例を示します。

T = @() datestr(now);d = t ()
d = 26-Jan-2012 15:11:47

代入ステートメントで小かっこを省略すると別の関数ハンドルが作成され,関数が実行されません。

d = t
D = @() datestr(now)

複数の入力または出力のある関数

無名関数では,標準の関数と同様に入力引数を明示的に指定し,複数の入力がある場合はコンマで区切る必要があります。たとえば,次の関数は2つの入力xyを受け取ります。

Myfunction = @(x,y) (x^2 + y^2 + x*y);x = 1;y = 10;z = myfunction (x, y)
z = 111

ただし,無名関数は1つの出力のみを返します。関数内の式が複数の出力を返す場合、関数ハンドルを呼び出すときに要求することができます。

たとえば,関数ndgridは入力ベクトルと同数の出力を返すことができます。ndgridを呼び出すこの無名関数は,1つの出力(mygrid)のみを返します。mygridを呼び出して,関数ndgridによって返された出力にアクセスします。

c = 10;Mygrid = @(x,y) ndgrid((-x:x/c:x),(-y:y/c:y));(x, y) = mygrid(π,2 *π);

mygridからの出力を使用して,メッシュまたは表面プロットを作成します。

Z = sinx + cosy;网格(x, y, z)

图中包含一个坐标轴。轴包含一个类型为曲面的对象。

無名関数の配列

ほとんどのMATLAB基本データ型は多次元配列をサポートしますが,関数ハンドルはスカラー(1つの要素)でなければなりません。ただし、细胞配列または構造体配列を使用して複数の関数ハンドルを格納できます。最も一般的な方法は,以下のように细胞配列を使用します。

f = {@ (x) x ^ 2;@ (y) y + 10;@ (x, y) x ^ 2 + y + 10};

细胞配列を作成するとき,MATLABは空白を列区切りとして解釈することに留意してください。前のコードで示されているように式から空白を削除するか,または以下のように式を小かっこで囲みます。

F = {@(x) (x.^2);@(y) (y + 10);@(x,y) (x.^2 + y + 10)};

中かっこを使用して,セルの内容にアクセスします。たとえば,f {1}は最初の関数ハンドルを返します。関数を実行するには、小かっこで囲まれた入力値を中かっこの後に渡します。

x = 1;y = 10;{1} f f (x) {2} {3} (y) f (x, y)
Ans = 1 Ans = 20 Ans = 21

関連するトピック