Этот пример показывает, как записать файл MEX, который передает скалярные значения.
Предположим, что у вас есть следующий код С, timestwo
, который берет скалярный входной параметр, 1
-by-1
матрица, и удваивает ее.
void timestwo(double y[], double x[]) { y[0] = 2.0*x[0]; return; }
Анализ кода С
Чтобы рассмотреть функцию, записанную как файл MEX, откройте timestwo.c
в Редакторе MATLAB®.
На C/C++ компилятор проверяет аргументы функции на номер и тип. Однако в MATLAB, можно передать любой номер или тип аргументов к функции; функция ответственна за проверку аргументов. Файлы MEX также позволяют вводы переменной. Ваш файл MEX должен безопасно обработать любое количество аргументов ввода или вывода любого поддерживаемого типа.
Этот код проверяет на соответствующее количество аргументов.
if(nrhs != 1) { mexErrMsgIdAndTxt( "MATLAB:timestwo:invalidNumInputs", "One input required."); } else if(nlhs>1) { mexErrMsgIdAndTxt( "MATLAB:timestwo:maxlhs", "Too many output arguments."); }
Этот код проверяет, является ли входной параметр действительным, скалярным двойным значением.
mrows = mxGetM(prhs[0]); ncols = mxGetN(prhs[0]); if( !mxIsDouble(prhs[0]) || mxIsComplex(prhs[0]) || !(mrows==1 && ncols==1) ) { mexErrMsgIdAndTxt( "MATLAB:timestwo:inputNotRealScalarDouble", "Input must be a noncomplex scalar double."); }
Создание и тестирование примера
Создайте файл MEX.
mex -v timestwo.c
Вызовите функцию.
x = 2; y = timestwo(x)
y = 4
Этот пример показывает, как записать файл MEX, который передает скаляр значением.
Функция mxGetScalar
возвращает значение скаляра вместо указателя на копию скалярной переменной, x
.
Следующий код С реализует функцию timestwo_alt
.
void timestwo_alt(double *y, double x) { *y = 2.0*x; }
Сравните подпись функции timestwo_alt
с подписью функции timestwo
.
void timestwo_alt(double *y, double x)
void timestwo(double y[], double x[])
Входное значение x
является скаляром типа double
. В функции timestwo
входное значение является матрицей типа double
.
Чтобы рассмотреть функцию, записанную как файл MEX, откройте timestwoalt.c
в редакторе MATLAB.
Сравните вызов timestwo_alt
к вызову timestwo
.
/* Get the scalar value of the input x */ /* note: mxGetScalar returns a value, not a pointer */ x = mxGetScalar(prhs[0]); /* Assign a pointer to the output */ y = mxGetPr(plhs[0]); /* Call the timestwo_alt subroutine */ timestwo_alt(y,x);
/* Assign pointers to each input and output. */ x = mxGetPr(prhs[0]); y = mxGetPr(plhs[0]); /* Call the timestwo subroutine. */ timestwo(y,x);
Значение x
, созданный mxGetScalar
, является скаляром не указатель.