Связывание C ++ с Matlab через mex: передача аргументов

0

Мне нужно вызвать код C++ из Matlab. Я знаю, что мне нужно написать оболочку mex, но я не могу понять, как правильно передать аргументы.

Вызываемая функция C++:

foo(int* n1,int* n2,int* n3,double* x,double* y,int* n4) 

x - матрица, на которой выполняются вычисления, y - выходной вектор. У меня возникли проблемы с передачей целочисленных аргументов, соответствующих размерам матрицы.

Я написал следующую оболочку:

void mexFunction(
     int          nlhs,
     mxArray      *plhs[],
     int          nrhs,
     const mxArray *prhs[]
     )
{
double  *x, *y;
int *n3,*n4;
mwSize nrow,ncols;

  x = mxGetPr(prhs[0]);
  n3 = mxGetPr(prhs[1]);
  n4 = mxGetPr(prhs[2]);
  nrow = mxGetM(prhs[0]);
  ncols = mxGetN(prhs[0]);

  /* Create a matrix for the return argument */ 
  plhs[0] = mxCreateDoubleMatrix(nrow, 1, mxREAL);
  y = mxGetPr(plhs[0]);


  foo(*nrow,*ncols,*n3, x,y,*n4);
  return;
  }

Однако, когда я пытаюсь скомпилировать, возникают следующие ошибки:

  • предупреждение C4267: '=': преобразование из 'size_t' в 'mwSize', возможную потерю данных (строка n3-n4)
  • предупреждение C4267: '=': преобразование из 'size_t' в 'mwSize', возможную потерю данных (nrow, ncol line)
  • ошибка C2100: незаконная косвенность (строка foo)

Я не могу понять, как это сделать. Любая помощь будет оценена по достоинству.

Теги:
mex

2 ответа

3
Лучший ответ

Есть некоторые ошибки, используйте его так, вам нужно отдать его в mwSize, чтобы избежать предупреждений:

nrow = (mwSize)mxGetM(prhs[0]);
ncols = (mwSize)mxGetN(prhs[0]);

Анад другое изменение заключается в том, что указатели передаются с использованием '&', и вам не нужно указывать * n4

foo(&nrow,&ncols,n3, x,y,n4);
  • 0
    Может быть, было бы более полезно вместо этого настроить типы переменных так, чтобы они соответствовали фактическим значениям? size_t nrow,ncols;
  • 0
    да, это может быть, но в этом случае я думаю, что это не будет иметь значения, потому что он передается как int в foo
Показать ещё 1 комментарий
0
warning C4267: '=' : conversion from 'size_t' to 'mwSize', possible loss of data (n3-n4 line)
warning C4267: '=' : conversion from 'size_t' to 'mwSize', possible loss of data (nrow,ncol line)

Здесь ваши целевые переменные меньше значений, возвращаемых функцией. Очевидно, что MATLAB изменил возвращаемые типы этих функций на size_t чтобы вы соответствовали вашим переменным.

По крайней мере, это была моя первая мысль. Но я ошибаюсь здесь: поскольку вы передаете (или должны передавать) адреса переменных, вы должны указать их на тип, необходимый функции.


error C2100: illegal indirection (foo line)

Это ясно: чего вы хотите достичь с помощью *nrow и *ncols? Они не являются указателями, поэтому использование * бессмысленно.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню