Для копирования комплексных значений данных между массивом Fortran и массивом MATLAB ® вызовите mxCopyComplex16ToPtr, mxCopyPtrToComplex16, mxCopyComplex8ToPtr, и mxCopyPtrToComplex8 функции. Пример convec.F занимает два COMPLEX*16 векторы строк и свертывает их. В этом примере используется сложная перемежающаяся версия API-интерфейса Fortran Matrix и предполагается базовое понимание файлов MEX, как описано в разделе Создание исходного файла MEX Fortran.
Эти инструкции копируют данные, определенные входными массивами prhs(1) и prhs(2) в переменные Фортрана x и y определяется как complex*16 массивы.
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)