実数/虚数分離型複素数の Fortran 関数への受け渡し
MATLAB® は Fortran と同様の方法で、1 つのベクトル pa
に実数部と虚数部をインターリーブして複素数を格納します。
MATLAB Version 9.4 (R2018a) 以前では、MATLAB は複素数を Fortran とは異なる形で、長さの等しい実数/虚数分離型ベクトル pr
および pi
に格納していました。その結果、それらのバージョンの MATLAB と Fortran 関数の間で交換された複素変数には互換性がありません。MATLAB は、この非互換に対応するために複素数の格納形式を変更する変換ルーチン例 mat2fort
および fort2mat
を提供しています。fort.h
ヘッダー ファイルは、関数 mat2fort
および fort2mat
を定義します。ソース コードは fort.c
ファイルにあります。
mat2fort
— MATLAB の実数/虚数分離型複素行列を Fortran の複素数ストレージに変換します。fort2mat
— Fortran の複素数ストレージを MATLAB の実数/虚数分離型の実数部と虚数部に変換します。
これらのルーチンを使用するには、次の手順に従います。
ステートメント
#include "fort.h"
を使用して、fort.h
ヘッダー ファイルをソース ファイルにインクルードします。fort.c
ファイルをプログラムにリンクします。ビルド コマンドで、fort.c
への絶対パスmatlabroot
/extern/examples/refbook
を指定します。ヘッダー ファイルを示すには、
-I
スイッチを使用します。ビルド コマンドで、pathname
fort.h
への絶対パスmatlabroot
/extern/examples/refbook
を指定します。絶対パスを指定するときは、
matlabroot
を実際のフォルダー名で置き換えてください。mex
-R2017b
オプションを使用して関数をビルドします。
複素数入力値の処理
複素数入力値を使用する関数については、引数をコピーする必要はありません。mat2fort
変換ルーチンが引数のコピーを作成します。詳細は、入力値の変更からの保全を参照してください。
複素数出力引数の処理
Fortran 関数から返される複素変数について、以下を行います。
変数用にストレージを割り当てる場合、同じサイズの変数に割り当てるスペースの 2 倍のスペースで実数変数を割り当てます。これは、返される変数は 2 倍のスペースを取る Fortran 形式を使用するため必要です。例の
zout
の割り当てを参照してください。変数に MATLAB との互換性をもたせるには、関数
fort2mat
を使用します。
複素変数の受け渡し — matrixDivideComplex
この例は、複素数 prhs[0]
を入力として渡し、複素数 plhs[0]
を出力として受け取る関数の呼び出し方を示します。一時変数 zin
と zout
には、入力値と出力値が Fortran 形式で含まれています。例を表示するには、MATLAB エディターで matrixDivideComplex.c
を開きます。MEX ファイルを作成するには、書き込み可能なフォルダーにソース ファイルをコピーします。
copyfile(fullfile(matlabroot,'extern','examples','refbook','matrixDivideComplex.c'),'.','f')
fort.c
ファイルとそのヘッダー ファイルを示す変数を作成します。
fortfile = fullfile(matlabroot,'extern','examples','refbook','fort.c'); fortheaderdir = fullfile(matlabroot,'extern','examples','refbook');
MEX 関数をビルドします。
mex('-R2017b',['-I' fortheaderdir],'matrixDivideComplex.c',fortfile,'-lmwlapack')
関数をテストします。
Areal = [1 2; 3 4]; Aimag = [1 1; 0 0]; Breal = [5; 6]; Bimag = [0; 0]; Acomplex = complex(Areal,Aimag); Bcomplex = complex(Breal,Bimag); X = matrixDivideComplex(Acomplex,Bcomplex)
X = -4.4000 + 0.8000i 4.8000 - 0.6000i
Fortran 複素数の戻り値型を処理 — dotProductComplex
レベル 1 の BLAS 関数 (たとえば、zdotu
と zdotc
) は、C 言語がサポートしていない double complex
型を返します。次の C MEX ファイル dotProductComplex.c
は、関数 zdotu
に対する Fortran 複素数の戻り値型の処理方法を示しています。例を表示するには、MATLAB エディターで dotProductComplex.c
を開きます。
出力引数に値を返す Fortran 関数を呼び出す C プログラムの呼び出し構文はプラットフォームによって変わります。Windows® と Mac のプラットフォームでは、戻り値を最初の入力引数として渡します。MATLAB には、これらの違いを処理するためのマクロ FORTRAN_COMPLEX_FUNCTIONS_RETURN_VOID
が用意されています。
dotProductComplex
の例では、2 つの複素数ベクトル A
と B
の各要素のドット積 X
を計算します。呼び出し構文は以下になります。
X = dotProductComplex(A,B)
ここで、A
と B
は同じサイズの複素数ベクトル、X
は複素数のスカラーです。
たとえば、次のようにビルドします。
copyfile(fullfile(matlabroot,'extern','examples','refbook','dotProductComplex.c'),'.','f') fortfile = fullfile(matlabroot,'extern','examples','refbook','fort.c'); fortheaderdir = fullfile(matlabroot,'extern','examples','refbook'); mex('-R2017b',['-I' fortheaderdir],'dotProductComplex.c',fortfile,'-lmwblas')
以下を入力してテストします。
a1 = [1+2i; 2+3i]; b1 = [-1+2i; -1+3i]; X = dotProductComplex(a1,b1)
X = -16.0000 + 3.0000i
LAPACK を使用した対称不定分解 — utdu_slv
例 utdu_slv.c
は LAPACK 関数 zhesvx
と dsysvx
を呼び出します。例を表示するには、MATLAB エディターで utdu_slv.c
を開きます。MEX ファイルを作成するには、書き込み可能なフォルダーにソース ファイルをコピーします。
copyfile(fullfile(matlabroot,'extern','examples','refbook','utdu_slv.c'),'.','f')
次のようにビルドします。
fortheaderdir = fullfile(matlabroot,'extern','examples','refbook'); mex('-R2017b',['-I' fortheaderdir],'utdu_slv.c',fortfile,'-lmwlapack')