exponenta event banner

Передача скалярных значений в файле C MEX

Передать скаляр как матрицу

В этом примере показано, как записать файл MEX, передающий скалярные значения.

Предположим, что у вас есть следующий код C, timestwo, который принимает скалярный вход, 1около-1 матрица и удваивает её.

void timestwo(double y[], double x[])
{
  y[0] = 2.0*x[0];
  return;
}

Анализ кода C

Чтобы увидеть функцию, записанную как 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, который передает скаляр по значению.

mxGetScalar функция возвращает значение скаляра вместо указателя на копию скалярной переменной, x.

Следующий код C реализует 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 = 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 является скаляром, а не указателем.