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