Main Content

MATLAB Fortran API ライブラリ

Fortran 行列 APIおよびFortran MEX APIでは、MATLAB® プログラムや MATLAB ワークスペース内のデータと対話するゲートウェイ ルーチンおよび計算ルーチンで使用できる関数について説明してます。

これらの関数を使用するには、エントリ ポイントおよびインターフェイス ルーチンを宣言している fintrf ヘッダーをインクルードします。このファイルは matlabroot\extern\include フォルダー内にあります。次のステートメントをソース ファイルに挿入します。

#include "fintrf.h"

行列ライブラリ

Fortran 行列 API 関数を使用して、MATLAB が配列の保存に使用する mxArray 型を、MEX ファイルとの間で受け渡します。これらの関数の使用例は、「matlabroot/extern/examples/mx」を参照してください。

MEX ライブラリ

Fortran MEX API 関数を使用して、MATLAB 環境で操作を実行します。これらの関数の使用例は、「matlabroot/extern/examples/mex」を参照してください。

MATLAB 関数とは異なり、MEX ファイル関数には自身の変数ワークスペースがありません。MEX ファイル関数は、呼び出し側のワークスペースで操作を行います。string を評価するには、mexEvalString を使用します。変数を取得してそれを呼び出し側のワークスペースに配置するには、関数 mexGetVariable および mexPutVariable を使用します。

プリプロセッサ マクロ

行列ライブラリおよび MEX ライブラリでは、プラットフォーム間の柔軟性を高めるため、MATLAB "プリプロセッサ マクロ" mwSize および mwIndex を使用します。mwSize は、配列の次元や要素数などのサイズ値を表します。mwIndex は、配列のインデックスなどのインデックス値を表します。

MATLAB には、Fortran ファイル向けに追加のプリプロセッサ マクロ mwPointer が含まれています。MATLAB では、固有のデータ型 mxArray が使用されます。Fortran ではデータ型を作成できないため、MATLAB は mwPointer プリプロセッサ マクロで作成される特殊な識別子を Fortran プログラムに渡します。このプロセスによって、Fortran のネイティブ データ型で mxArray の情報を取得できます。たとえば、mxArray のサイズを求め、それが文字列かどうかを判断し、この配列の内容を確認できます。プラットフォームに依存しないコードを作成するには、関数 mwPointer を使用します。

Fortran プリプロセッサは、32 ビット プラットフォーム上でバイナリ MEX ファイルをビルドする際は mwPointerinteger*4 に変換し、64 ビット プラットフォーム上でビルドする際は integer*8 に変換します。

メモ

無効なサイズでポインターを宣言すると、プログラムがクラッシュする場合があります。

Fortran %val 構成要素の使用

Fortran %val(arg) 構成要素は、引数 arg が参照ではなく値によって渡されるように指定します。すべてではありませんが、ほとんどの Fortran コンパイラでは %val 構成要素がサポートされています。

%val 構成要素をサポートしていないコンパイラを使用している場合は、mxCopy* ルーチン (mxCopyPtrToReal8 など) を使用して配列の値を一時的な Fortran 配列にコピーします。

%val 構成要素の例

%val 構成要素をサポートしているコンパイラを使用している場合は、データを直接指すルーチン (関数 mxGetDoubles または関数 mxGetComplexDoubles のような型付きのデータ アクセス関数によって返されるポインター) を使用できます。%val を使用してこのポインターの内容をサブルーチンに渡すことができ、その中でこれは Fortran の倍精度行列として宣言されます。

たとえば、計算ルーチン yprime を呼び出すゲートウェイ ルーチンを考えます。

call yprime(%val(yp), %val(t), %val(y))

Fortran コンパイラが %val 構成要素をサポートしていない場合、計算サブルーチンの呼び出しを以下に置き換えます。

C Copy array pointers to local arrays.
       call mxCopyPtrToReal8(t, tr, 1)
       call mxCopyPtrToReal8(y, yr, 4)
C
C Call the computational subroutine.
       call yprime(ypr, tr, yr)
C
C Copy local array to output array pointer.
       call mxCopyReal8ToPtr(ypr, yp, 4)

また、ゲートウェイ ルーチンの最初の行に次の宣言文を加えなければなりません。

real*8 ypr(4), tr, yr(4)

mxCopyPtrToReal8 または他の mxCopy* ルーチンを使用する場合、Fortran ゲートウェイ ルーチンで宣言される配列のサイズは、MATLAB から MEX ファイルへの入力のサイズ以上でなければなりません。それ以外の場合、mxCopyPtrToReal8 は正常に動作しません。

参考

| | | | |