外部インタフェース/API | ![]() ![]() |
本章では、Fortran言語でMEX-ファイルを作成する方法を説明します。MEX-ファイル本体、Fortran言語ファイルがMATLABとどのように作用するか、異なるデータタイプの引数をどのように渡して操作するか、MEX-ファイルプログラムのデバッグ方法、その他のアドバンスドトピックスについて説明します。
Fortran MEX-ファイル
Fortran MEX-ファイルは、APIルーチンの呼び出しを使ってFortranソースコードをコンパイルするために、mex
スクリプトを使って作られます。
FortranのMEX-ファイルは、倍精度データと文字列のみを作成することができます(MATLABがサポートする任意のデータタイプを作成できるCの場合と異なります)。Fortran MEX-ファイルはコンパイルするとM-ファンクションのように扱うことができます。
Fortran MEX-ファイルの部分
この節では、Fortran MEX-ファイルで必要な特定の要素について説明します。Fortran MEX-ファイルのソースコードは、C MEX-ファイルのように2つの部分から成り立ちます。
mexFunction
とパラメータprhs
, nrhs
, plhs
, nlhs
により、計算ルーチンとMATLABのインタフェースを行うゲートウェイルーチン。ここで、prhs
は右辺入力引数の配列、nrhs
は右辺入力引数の数、plhs
は左辺出力引数の配列、nlhs
は左辺出力引数の数です。ゲートウェイは、計算ルーチンをサブルーチンとして呼び出します。計算ルーチンとゲートウェイルーチンは、分離しているか、結合しています。つぎの図Fortran MEXサイクルは、どのように入力がAPI関数に入るか、ゲートウェイ関数がどの関数を実行するか、どのようにMATLABに出力するかを示します。
ポインタのコンセプト
MATLAB APIは、一意的なデータタイプmxArray
をもちます。Fortranでは新しいデータタイプを作成する方法がないため、MATLABはポインタと呼ばれる特殊な識別子をFortranプログラムに渡します。このポインタをアクセスルーチン
と呼ばれる様々なAPI関数に渡すことで、mxArray
についての情報を得ることができます。これらのアクセスルーチンにより、mxArray
のサイズ、文字列かどうか、データの内容のような、ユーザの知りたい情報を含むネイティブなFortranのデータタイプを得ることができます。
Fortranでポインタを使うときには、つぎのような特徴があります。
%val
コンストラクトFortranコンパイラが%val
コンストラクトをサポートしていれば、アクセスルーチンを要求しないで使うことができるポインタ(mxGetPr
またはmxGetPi
が出力するポインタ)、すなわちデータのポインタがあります。このポインタの内容をサブルーチンに渡すために%val
を使うことができ、これはFortranの倍精度行列として宣言されます。
Fortranコンパイラが%val
コンストラクトをサポートしていない場合、ポインタの内容にアクセスするためには、mxCopy__
ルーチン(例、 mxCopyPtrToReal8
)を使わなければなりません。%val
コンストラクトとその例に関する情報は、「%valコンストラクト」を参照してください。
ポインタを適切に使うために、正しいサイズになるように宣言しなければなりません。DEC Alphaマシンでは、すべてのポインタはinteger*8
と宣言されます。他のすべてのプラットフォームでは、ポインタはinteger*4
と宣言されます。
FortranコンパイラがCのプリプロセッサをサポートしていれば、プリプロセッシングステージを使ってポインタを適切な宣言へマップすることができます。UNIXでの可能な例については、examples
ディレクトリの.F
で終わる例を参照してください。
ゲートウェイルーチン
ゲートウェイサブルーチンのエントリポイントは、mexFunction
という名前で、つぎのパラメータを含まなければなりません。
subroutine mexFunction(nlhs, plhs, nrhs, prhs) integer plhs(*), prhs(*) integer nlhs, nrhs
Fortran MEX-ファイルでは、パラメータnlhs
とnrhs
は、MEX-ファイルが呼び込まれる左辺と右辺の引数の数を含みます。prhs
は、MEX-ファイルの右辺入力へのポインタを含む長さnrhs
の配列で、plhs
はFortran関数が出力する左辺出力のポインタを含む長さnlhs
の配列です。
MATLAB言語のシンタックスでは、関数はつぎのような一般的な形式をもちます。
[a,b,c,...] = fun(d,e,f,...)
ここで、省略形(...
)は同じ形式の項を表わします。a,b,c,...
は左辺引数で、d,e,f,...
は右辺引数です。
ゲートウェイルーチンの例として、MEX-ファイルをつぎのコマンドでMATLABワークスペースから呼び込むことを考えます。
x = fun(y,z);
MATLABインタプリタは、つぎの引数をもつmexFunction
をコールします。
plhs
は、一つの要素がnull
ポインタである1要素のC配列です。prhs
は、1番目の要素がY
というmxArray
のポインタで、2番目の要素がZ
というmxArray
のポインタである2要素のC配列です。
出力x
はサブルーチンが実行するまで作成されないので、パラメータplhs
は何もポイントしません。出力配列を作成し、plhs(1)
の配列のポインタを設定するのはゲートウェイルーチンです。plhs(1)
が割り当てられない場合は、MATLABは出力が割り当てられていないことを示すワーニングメッセージを表示します。
ゲートウェイルーチンは入力引数を確認し、誤りがあればmexErrMsgTxt
を呼び出します。これは、出力配列数のチェックと同様に、入力配列の数、タイプ、サイズのチェックを含みます。この節の後の例では、このテクニックを説明します。
mx
ファンクションは、MATLAB配列操作のためのアクセス法(サブルーチン)を提供します。これらの関数は、オンラインのAPIリファレンスページに記述されています。接頭語mx
はmxArray
に対する省略表現で、関数を使ってMATLAB配列の情報の操作やアクセスができることを意味します。たとえば、mxGetPr
はMATLAB配列内の実数データを取得します。MATLAB配列とFortran配列のデータの転送のためにルーチンが提供されています。
ゲートウェイルーチンは、結果を出力するために要求されるサイズの配列を作成するために、mxCreateFull
, mxCreateSparse
, mxCreateString
を呼び出さなければなりません。これらの呼び出しの出力値は、plhs
の適切な要素に割り当てられます。
ゲートウェイルーチンは、必要ならば計算ルーチン用の一時的な作業配列を割り当てるためにmxCalloc
を呼び出します。
ゲートウェイルーチンは、希望する計算や演算を行うために、計算ルーチンを呼び出します。MEX-ファイルが使用できる多くのルーチンがあります。これらのルーチンは、mexCallMATLAB
とmexErrMsgTxt
のように最初のキャラクタmex
で区別されます。
MEX-ファイルがその作業を終了するとき、MATLABに制御が戻ります。左辺引数によってMATLABに制御が戻らないMEX-ファイルが作成するデータ構造体は、自動的に破棄されます。
![]() | Windowsでのデバッグ | %valコンストラクト | ![]() |