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