複素数 Fortran データの処理
複素数データ値を Fortran 配列と MATLAB® 配列の間でコピーするには、関数 mxCopyComplex16ToPtr
、mxCopyPtrToComplex16
、mxCopyComplex8ToPtr
、および mxCopyPtrToComplex8
を呼び出します。この convec.F
の例では 2 つの COMPLEX*16
行ベクトルを取り、それらを畳み込みます。この例は、インターリーブされた複素数バージョンの Fortran 行列 API を使用し、Fortran ソース MEX ファイルの作成に説明されているような MEX ファイルの基本的な理解を前提としています。
次のステートメントは、入力配列 prhs(1)
と prhs(2)
によって定義されたデータを、complex*16
配列として定義されている Fortran 変数 x
と y
にコピーします。
C Load the data into Fortran arrays(native COMPLEX data). status = + mxCopyPtrToComplex16(mxGetComplexDoubles(prhs(1)),x,nx) if (status .ne. 1) then call mexErrMsgIdAndTxt ( + 'MATLAB:convec:CopyingFailed', + 'Could not copy from prhs(1) to complex*16.') endif status = + mxCopyPtrToComplex16(mxGetComplexDoubles(prhs(2)),y,ny) if (status .ne. 1) then call mexErrMsgIdAndTxt ( + 'MATLAB:convec:CopyingFailed', + 'Could not copy from prhs(2) to complex*16.') endif
convec
サブルーチンを呼び出します。
call convec(x,y,z,nx,ny)
結果を MATLAB の出力配列 plhs(1)
にコピーします。
C Load the output into a MATLAB array. status = + mxCopyComplex16ToPtr(z,mxGetComplexDoubles(plhs(1)),nz) if (status .ne. 1) then call mexErrMsgIdAndTxt ( + 'MATLAB:convec:CopyingFailed', + 'Could not copy from complex*16 to plhs(1).') endif
ビルドとテスト
Fortran コンパイラがインストールされていることを確認します。
mex -setup fortran
convec.F
ファイルを書き込み可能なフォルダーにコピーします。
copyfile(fullfile(matlabroot,'extern','examples','refbook','convec.F'),'.','f')
ファイルをビルドします。
mex -R2018a convec.F
MEX ファイルをテストします。
x = [3.000 - 1.000i, 4.000 + 2.000i, 7.000 - 3.000i]; y = [8.000 - 6.000i, 12.000 + 16.000i, 40.000 - 42.000i]; z = convec(x,y)
z = 1.0e+02 * Columns 1 through 4 0.1800 - 0.2600i 0.9600 + 0.2800i 1.3200 - 1.4400i 3.7600 - 0.1200i Column 5 1.5400 - 4.1400i
結果を、組み込み MATLAB 関数 conv
と比較します。
conv(x,y)