Создание исходного файла MEX Фортрана

Этот пример показывает, как записать файл MEX, чтобы вызвать стандартную подпрограмму Фортрана, timestwo, в MATLAB® с помощью матрицы MATLAB. Можно просмотреть полный исходный файл здесь. Этот пример использует редактора MATLAB, чтобы записать исходный код и команду mex MATLAB, чтобы создать 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======================================================================

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

#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))

Чтобы создать массив Фортрана, 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

Смотрите также

| | | | | | |

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте