В этом примере показано, как записать файл 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 с помощью 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