exponenta event banner

Создание исходного MEX-файла Fortran

В этом примере показано, как записать MEX-файл для вызова подпрограммы Fortran, timestwo, в MATLAB ® с использованием матрицы MATLAB. Полный исходный файл можно просмотреть здесь. В этом примере редактор MATLAB используется для записи исходного кода и MATLAB.mex для создания функции MEX.

Подпрограмма Фортрана timestwo

Следующий код определяет timestwo подпрограмму, которая умножает n-мерный массив, x_inputоколо 2и возвращает результаты в массиве, y_output.

      subroutine timestwo(y_output, x_input)
      real*8 x_input, y_output

      y_output = 2.0 * x_input
      return
      end

Создать исходный файл

Откройте редактор MATLAB, создайте файл и запишите файл MEX со следующей информацией.

C======================================================================
C     timestwo.f
C     Computational function that takes a scalar and doubles it.
C     This is a MEX file for MATLAB.
C======================================================================

Добавьте файл заголовка Fortran, fintrf.h, содержащий объявления функций API MATLAB.

#include "fintrf.h"

Сохраните файл по пути MATLAB, например, в c:\work, и назовите его timestwo.F. Имя файла MEX: timestwo.

Создать подпрограмму шлюза

MATLAB использует подпрограмму шлюза, mexfunction, в качестве точки входа в подпрограмму Фортрана. Добавить следующее mexFunction код.

C     Gateway routine
      subroutine mexFunction(nlhs, plhs, nrhs, prhs)

C     Declarations

C     Statements

      return
      end

Добавьте следующее заявление к своему mexfunction чтобы принудительно объявить все переменные.

implicit none

Явное объявление типа необходимо для 64-разрядных массивов.

Объявить mexfunction Аргументы

Объявить mxArray переменные, используйте тип MATLAB, mwPointer. Добавить этот код после Declarations заявление.

C     mexFunction arguments:
      mwPointer plhs(*), prhs(*)
      integer nlhs, nrhs

Объявить функции и локальные переменные

  • Объявите символические имена и типы функций MATLAB API, используемых в этом файле MEX.

    C     Function declarations:
          mwPointer mxGetDoubles
          mwPointer mxCreateDoubleMatrix
          integer mxIsNumeric
          mwPointer mxGetM, mxGetN

    Для определения типа функции см. справочную документацию по функции MATLAB API. Например, см. документацию для mxGetDoubles.

  • Объявить локальные переменные для mexfunction аргументы.

    C     Pointers to input/output mxArrays:
          mwPointer x_ptr, y_ptr
    
  • Объявить переменные матрицы.

    C     Array information:
          mwPointer mrows, ncols
          mwSize size
    

Проверка входных и выходных аргументов файла MEX

Проверьте количество входных и выходных аргументов файла MEX с помощью nrhs и nlhs аргументы. Добавить эти инструкции в mexfunction кодовый блок.

C     Check for proper number of arguments. 
      if(nrhs .ne. 1) then
         call mexErrMsgIdAndTxt ('MATLAB:timestwo:nInput',
     +                           'One input required.')
      elseif(nlhs .gt. 1) then
         call mexErrMsgIdAndTxt ('MATLAB:timestwo:nOutput',
     +                           'Too many output arguments.')
      endif

Проверьте тип входного аргумента с помощью prhs аргумент.

C     Check that the input is a number.
      if(mxIsNumeric(prhs(1)) .eq. 0) then
         call mexErrMsgIdAndTxt ('MATLAB:timestwo:NonNumeric',
     +                           'Input must be a number.')
      endif

Создание вычислительной программы

Добавить timestwo код. Эта подпрограмма является вашей вычислительной подпрограммой, исходным кодом, который выполняет функции, которые вы хотите использовать в MATLAB.

C     Computational routine

      subroutine timestwo(y_output, x_input)
      real*8 x_input, y_output

      y_output = 2.0 * x_input
      return
      end

Вычислительная процедура является необязательной. Кроме того, можно поместить код в mexfunction функциональный блок.

Объявить переменные для подпрограммы вычислений

Поместить следующие объявления переменных в mexFunction.

C     Arguments for computational routine:
      real*8  x_input, y_output

Чтение входного массива

Чтобы указать на данные входной матрицы, используйте mxGetDoubles функция.

x_ptr = mxGetDoubles(prhs(1))

Чтобы создать массив Fortran, x_input, используйте mxCopyPtrToReal8 функция.

C     Get the size of the input array.
      mrows = mxGetM(prhs(1))
      ncols = mxGetN(prhs(1))
      size = mrows*ncols

C     Create Fortran array from the input argument.
      call mxCopyPtrToReal8(x_ptr,x_input,size)

Подготовка выходных данных

Чтобы создать выходной аргумент, plhs(1), используйте mxCreateDoubleMatrix функция.

C     Create matrix for the return argument.
      plhs(1) = mxCreateDoubleMatrix(mrows,ncols,0)

Используйте mxGetDoubles для назначения функции y_ptr аргумент для plhs(1).

      y_ptr = mxGetDoubles(plhs(1))

Выполнить расчет

Передать аргументы timestwo.

C     Call the computational subroutine.
      call timestwo(y_output, x_input)

Копировать результаты в выходной аргумент

C     Load the data into y_ptr, which is the output to MATLAB.
      call mxCopyReal8ToPtr(y_output,y_ptr,size)     

Просмотр полного исходного файла

Сравнение исходного файла с timestwo.F, расположенный в matlabroot/extern/examples/refbook папка. Откройте файл в редакторе.

Построить двоичный файл MEX

В командной строке MATLAB создайте двоичный файл MEX.

mex -R2018a timestwo.F

Тестирование файла MEX

x = 99;
y = timestwo(x)
y =
   198

См. также

| | | | | | |

Связанные темы