Обработайте сложные данные ФОРТРАН

Чтобы скопировать комплексные данные значения между массивом Фортрана и MATLAB® массив, вызов mxCopyComplex16ToPtr, mxCopyPtrToComplex16, mxCopyComplex8ToPtr, и mxCopyPtrToComplex8 функций. Пример convec.F занимает два COMPLEX*16 векторы-строки и свертки. Этот пример использует перемеженную комплексную версию Фортран Matrix и принимает основные представления о файлах MEX, как описано в Create Fortran Source MEX File.

Эти операторы копируют данные, заданные входными массивами 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

Построение и тестирование

Убедитесь, что у вас есть установленный компилятор Фортран.

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)

См. также

Похожие темы