Мне нужно вызвать код 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;
}
Однако, когда я пытаюсь скомпилировать, возникают следующие ошибки:
Я не могу понять, как это сделать. Любая помощь будет оценена по достоинству.
Есть некоторые ошибки, используйте его так, вам нужно отдать его в mwSize, чтобы избежать предупреждений:
nrow = (mwSize)mxGetM(prhs[0]);
ncols = (mwSize)mxGetN(prhs[0]);
Анад другое изменение заключается в том, что указатели передаются с использованием '&', и вам не нужно указывать * n4
foo(&nrow,&ncols,n3, x,y,n4);
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
? Они не являются указателями, поэтому использование *
бессмысленно.
size_t nrow,ncols;