Main Content

実数/虚数分離型複素数の 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 の実数/虚数分離型の実数部と虚数部に変換します。

これらのルーチンを使用するには、次の手順に従います。

  1. ステートメント #include "fort.h" を使用して、fort.h ヘッダー ファイルをソース ファイルにインクルードします。

  2. fort.c ファイルをプログラムにリンクします。ビルド コマンドで、fort.c への絶対パス matlabroot/extern/examples/refbook を指定します。

  3. ヘッダー ファイルを示すには、-Ipathname スイッチを使用します。ビルド コマンドで、fort.h への絶対パス matlabroot/extern/examples/refbook を指定します。

  4. 絶対パスを指定するときは、matlabroot を実際のフォルダー名で置き換えてください。

  5. mex -R2017b オプションを使用して関数をビルドします。

複素数入力値の処理

複素数入力値を使用する関数については、引数をコピーする必要はありません。mat2fort 変換ルーチンが引数のコピーを作成します。詳細は、入力値の変更からの保全を参照してください。

複素数出力引数の処理

Fortran 関数から返される複素変数について、以下を行います。

  1. 変数用にストレージを割り当てる場合、同じサイズの変数に割り当てるスペースの 2 倍のスペースで実数変数を割り当てます。これは、返される変数は 2 倍のスペースを取る Fortran 形式を使用するため必要です。例の zout の割り当てを参照してください。

  2. 変数に MATLAB との互換性をもたせるには、関数 fort2mat を使用します。

複素変数の受け渡し — matrixDivideComplex

この例は、複素数 prhs[0] を入力として渡し、複素数 plhs[0] を出力として受け取る関数の呼び出し方を示します。一時変数 zinzout には、入力値と出力値が 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 関数 (たとえば、zdotuzdotc) は、C 言語がサポートしていない double complex 型を返します。次の C MEX ファイル dotProductComplex.c は、関数 zdotu に対する Fortran 複素数の戻り値型の処理方法を示しています。例を表示するには、MATLAB エディターで dotProductComplex.c を開きます。

出力引数に値を返す Fortran 関数を呼び出す C プログラムの呼び出し構文はプラットフォームによって変わります。Windows®Mac のプラットフォームでは、戻り値を最初の入力引数として渡します。MATLAB には、これらの違いを処理するためのマクロ FORTRAN_COMPLEX_FUNCTIONS_RETURN_VOID が用意されています。

dotProductComplex の例では、2 つの複素数ベクトル AB の各要素のドット積 X を計算します。呼び出し構文は以下になります。

X = dotProductComplex(A,B)

ここで、AB は同じサイズの複素数ベクトル、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 関数 zhesvxdsysvx を呼び出します。例を表示するには、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')