Programming and Data Types | ![]() ![]() |
上にリストした利点の個々については、この節の中で詳細に記されています。つぎのトピックについて、説明しています。
この節では、簡単な、関数ハンドルを用いた例も示します。詳細は、 簡単な関数ハンドルを参照してください。
関数ハンドルを渡す
関数ハンドルをコール時に引数として、他の関数に渡すことができます。ハンドルは、アクセス情報を含んでいて、それを使って、渡された関数が、ハンドルにくっ付いている関数をコールすることができます。
関数のハンドルが、関数を計算する部分に存在していない場合さえも、他の関数の中から関数ハンドルを計算することができます。これは、計算を行なう関数が、関数ハンドルの中に必要なすべての情報をもっているからです。
同じ理由で、ハンドルの関数が、MATLABのサーチパス上になくても、関数ハンドルを計算することができます。
ユーザは、MATLABのfeval
コマンドを使って、関数ハンドルの中の関数を計算する必要があります。関数ハンドルを引数として他の関数に渡す場合、ハンドルを受け取った関数は、関数ハンドルを計算するために、feval
を使います。
多重定義関数ハンドル
多くのMATLAB関数は、多重定義されているので、関数ハンドルは、関数と実現するいくつかのコードソース(たとえば、組み込みコード、M-ファイル)にマッピングされています。関数ハンドルは、ハンドルが作成された時点でMATLABパス上に存在する、多重定義されたソース、または、メソッドのすべてへのアクセスをストアします。
多重関数ハンドルを計算するとき、MATLABは、計算するために、どのメソッドを選択するかと、関数コールの中で渡される引数タイプの選択に関して、一般的なルールに従っています。MATLABがどのように多重定義関数を選択するかに関する情報については、 MATLABがメソッドを読み込む優先順位の決定法を参照してください。
たとえば、標準のMATLABパス上に関数abs
を定義する3つの組み込み関数と1つのM-ファイル関数があります。関数abs
に対して作成される関数ハンドルは、これら関数ソースの4つすべてに関するアクセス情報を含んでいます。タイプ
double
を引数として関数を計算する場合、double
引数をもつ組み込み関数が実行されます。
サブ関数とプライベート関数
定義により、すべてのMATLAB関数は、あるスコープをもっています。これらは、そのスコープの中で、他のMATLAB要素を可視化できますが、その外部では可視化できません。そのスコープの中にある他の関数から関数を直接起動することもできますが、そのスコープの外部の関数からはできません。
サブ関数とプライベート関数は、他のMATLAB関数に対して、可視性に関して制限を与えるように設計されています。同じM-ファイルの中で定義された他の関数によってのみサブ関数を起動できます。ユーザは、サブディレクトリ\private
のすぐ上位のデレクトリの中の関数からのみプライベート関数を起動できます。
制限のあるスコープをもつ関数へのハンドルを作成する場合、関数ハンドルは、MATLAB環境の中のある位置から関数を計算するために必要な情報をすべて含むことができます。サブ関数がスコープの中に位置していて、サブ関数へのハンドルを作成する場合(すなわち、サブ関数を定義するM-ファイルの中にそれを作成する)、ユーザは、ハンドルをM-ファイルの外側に位置するコードに渡し、通常のスコープを超えて、サブ関数を計算します。同様なことが、プライベート関数にも適用されます。
関数を計算するときの信頼性の保証
関数ハンドルを使って、定義したスコープ内の関数のみを含ませると、ユーザは、MATLABが関数ハンドルを計算するときに実行される関数全体をコントロールすることができます。これは、計算するときに、スコープの中に位置する関数から知らなくて良いものを分離することができます。ユーザは、関数ハンドルが計算される場合、実行しているどのメソットを得るかのコントロールを行います。
ファイル数の増加を押さえる
関数ハンドルを使って、ユーザの関数を定義するために必要なM-ファイルの数を少なくする手助けを行うことができます。一つのM-ファイルの中にいくつかの関数をまとめることに付随する問題は、これらをサブ関数と定義することで、それにより、MATLABの中のでそのスコープを減らすことができます。関数ハンドルを使って、サブ関数にアクセスして、この制限を取り去ります。ユーザが、取り扱う必要のあるファイル数を減らしたい場合、関数をグループ化することにより、可能になります。
繰り返し演算の中での性能の向上
MATLABは、関数ハンドルを作成した時点で関数についてのルックアップを行い、ハンドル自身の中のアクセス情報をストアします。一度定義すると、繰り返し計算の中で、このハンドルを使うことができ、関数のルックアップを毎回行なうことによるパフォーマンスの劣化を起こさないようにします。
関数ハンドルは、MATLABデータタイプです。
標準のMATLABデータタイプとして、関数ハンドルは、他のMATLABデータタイプと同じ方法で取り扱い、演算できます、ユーザは、関数ハンドルの配列、構造体、セル配列を作成することができます。数値配列や構造体の要素にアクセスする方法と同様に、これらのデータ構造体の中の個々の関数ハンドルにアクセスします。
MATLAB配列の他のタイプを作成するために使用する連結メソッド、
[]
、または、cat
のいずれかを使って、n次元の配列のハンドルを作成します。行列取り扱いを含むすべての演算は、関数ハンドルに対してサポートされています。
![]() |
関数ハンドル | 簡単な関数ハンドル | ![]() |