В этом примере показано, как записать 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 с помощью 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
В командной строке MATLAB создайте двоичный файл MEX.
mex -R2018a timestwo.F
x = 99; y = timestwo(x)
y = 198
mexfunction | mwPointer | mwSize | mxCreateDoubleMatrix | mxGetDoubles | mxGetM | mxGetN | mxIsNumeric