В этом примере показано, как записать файл 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 -R2018a timestwo.c
Вызовите функцию.
x = 2; y = timestwo(x)
y = 4
В этом примере показано, как записать файл MEX, который передает скаляр по значению.
The 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
function, входное значение является матрицей типа 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 = mxGetDoubles(plhs[0]); /* Call the timestwo_alt subroutine */ timestwo_alt(y,x);
/* Assign pointers to each input and output. */ x = mxGetDoubles(prhs[0]); y = mxGetDoubles(plhs[0]); /* Call the timestwo subroutine. */ timestwo(y,x);
Значение x
созданный mxGetScalar
является скаляром, а не указателем.