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

Передача скаляра как матрицы

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

Предположим, что у вас есть следующий код С, timestwo, это берет скалярный вход, 1- 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, который передает скаляр значением.

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 = 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 скаляр не указатель.