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