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