通过MEX将C 链接到MATLAB:通过参数

Linking C++ to Matlab via mex: passing arguments

本文关键字:参数 MATLAB MEX 链接 通过      更新时间:2023-10-16

我需要从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线)

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

有一些错误,这样使用,您需要将其施放以避免警告:

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