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

Передайте Скаляр как Матрицу

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