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

В этом примере показано, как записать файл MEX для вызова стандартной подпрограммы Фортран, 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======================================================================

Добавьте заголовочный файл Фортран, 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

См. также

| | | | | | |

Похожие темы