Fortran MEX ファイルのコンポーネント
mexFunction
ゲートウェイ ルーチン
"ゲートウェイ ルーチン" は、MEX ファイルへのエントリ ポイントです。MATLAB® が MEX ファイルの残りのルーチンにアクセスするとき、このルーチンが使用されます。ゲートウェイ ルーチンの名前は mexFunction
です。これにより、ソース コードのメイン プログラムが置き換えられます。
MEX ファイルの命名
mexFunction
を含むソース ファイルの名前が MEX 関数の名前、つまり MATLAB で呼び出す関数の名前になります。Fortran ソース ファイルの名前には、大文字の .F
のファイル拡張子を使用します。
バイナリ MEX ファイルのファイル拡張子は、プラットフォームに依存します。ファイル拡張子は、関数 mexext
で現在のマシンの値を取得することで確認できます。
.f
ファイルと .F
ファイルの違い
Fortran MEX ファイルがプラットフォームに依存しないようにするには、ファイルの拡張子として大文字の .F
を使用します。
Fortran コンパイラは、小文字の .f
のファイル拡張子をもつソース ファイルの場合、前処理が完了していると見なします。ほとんどのプラットフォームでは、関数 mex
を実行すると、ファイル拡張子に関係なく必ずファイルが前処理されます。ただし、Apple Macintosh プラットフォームでは、mex
を実行しても前処理が行われません。
必須パラメーター
Fortran の関数 mexfunction
のシグネチャは以下のとおりです。
subroutine mexFunction(nlhs, plhs, nrhs, prhs) integer nlhs, nrhs mwpointer plhs(*), prhs(*)
このサブルーチンは、ソース ファイル内の計算ルーチンやその他のサブルーチンの後に配置します。
次の表では、mexFunction
のパラメーターについて説明します。
パラメーター | 説明 |
---|---|
prhs | 右辺入力引数の配列。 |
plhs | 左辺出力引数の配列。 |
nrhs | 右辺引数の数、つまり配列 prhs のサイズ。 |
nlhs | 左辺引数の数、つまり配列 plhs のサイズ。 |
prhs
および plhs
を mwPointer
型として宣言します。つまり、これは MATLAB 配列を指します。これらは MEX ファイルの引数へのポインターを含むベクトルです。
名前 prhs
は "parameters, right-hand side (パラメーター、右辺)" を表していると解釈でき、入力パラメーターであることがわかります。同様に、plhs
は "parameters, left side (パラメーター、左辺)" を表しており、出力パラメーターであることがわかります。
入出力パラメーターの管理
入力パラメーター (配列 prhs
にある) は読み取り専用です。MEX ファイルで変更しないようにしてください。入力パラメーター内のデータを変更すると、好ましくない副次作用が生じることがあります。
出力データや MEX ファイルでローカルに使用する任意のデータを作成するために入力パラメーターを使用する際も、注意が必要です。入力配列を出力配列 (たとえば、plhs(1)
) にコピーする場合、関数 mxDuplicateArray
を呼び出して入力配列のコピーを作成します。以下に例を示します。
plhs(1) = mxDuplicateArray(prhs(1))
詳細は、トラブルシューティングのトピックセルまたは構造体 mxArray の不適切な作成を参照してください。
入力の検証
サブルーチンの入力を検証する関数の一覧は、行列ライブラリのカテゴリFortran データの検証を参照してください。関数 mxIsClass
は mxArray
のテストにおいて汎用的に働きます。
計算ルーチン
"計算ルーチン" には、バイナリ MEX ファイルへの実装が望まれる計算を実行するためのコードが含まれています。必須ではありませんが、ゲートウェイ ルーチン mexFunction
を記述して計算ルーチンを呼び出すことを検討してください。入力パラメーターを検証してそれらを計算ルーチンで必要な型に変換するには、mexFunction
コードをラッパーとして使用します。
ゲートウェイ ルーチンと計算ルーチンを別々に記述する場合、1 つのソース ファイルにまとめることも別々のファイルにすることもできます。別々のファイルを使用する場合、mexFunction
を含むファイルは mex
コマンドでリストされる最初のソース ファイルでなければなりません。
参考
mexFunction
| mxIsClass
| mxDuplicateArray
| mexext
| mwPointer