通过mex将C ++链接到Matlab:传递参数

时间:2014-02-01 14:35:13

标签: c++ matlab mex

我需要从Matlab调用C ++代码。我知道我必须编写一个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行)

我似乎无法弄清楚如何使这项工作。任何帮助,将不胜感激。

2 个答案:

答案 0 :(得分:3)

有一些错误,像这样使用它,你需要将其强制转换为mwSize以避免警告:

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

Anad的另一个变化是使用'&'传递指针而你不需要给* n4

foo(&nrow,&ncols,n3, x,y,n4);

答案 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实现什么目标?它们不是指针,因此使用*毫无意义。