2014-02-13 28 views
3

我想在Matlab中使用我想要制作成mex文件的C++的特征库。我将代码分解为下面的要点。我需要制作一个返回向量,其长度与输入矩阵的行数相对应。在Matlab mex文件中使用特征向量

随着代码下面我得到的编译对应于所述线的follwing错误:

double y_OUT[nrow] = {};

  • 错误C2057:预期常量表达式错误
  • 错误C2466:不能分配的阵列常量大小0

我想不通为什么我不能分配长度为nrow的向量。 通过取消注释特定行和通过打印nrow我证实它实际上包含正确的数字。有人可以给任何指针(双关语)?

 void mexFunction(
      int   nlhs, 
      mxArray  *plhs[], 
      int   nrhs, 
      const mxArray *prhs[] 
      ) 
    { 



     double *x_IN; 
     int nrow,ncols; 

     /* Check for proper number of arguments */ 
     //... 

     x_IN = mxGetPr(prhs[0]); 
     nrow = (int)mxGetM(prhs[0]); 
     ncols = (int)mxGetN(prhs[0]); 

     double y_OUT[nrow] = {}; 

     MatrixXd x=Map<MatrixXd>(x_IN,nrow,ncols); 
     VectorXd Respons=VectorXd::Zero(nrow); 

     Map<VectorXd>(y_OUT,nrow)=Respons.array(); 
     return; 
    } 
+0

你能纠正你的代码?你可以更新它到一个工作版本?我无法从mex matlab输入参数创建一个特征矩阵。 – Pedro77

回答

6

你没有在那里分配任何东西。行double y_OUT[nrow] = {};包含两个错误。如错误消息所述。

  1. nrow不是constexpr。它不能在编译时进行评估。
  2. 通过大括号初始值设定,你建议矢量有0元素,它也没有意义。

动态分配的正确语法是:double* y_OUT = new double[nrow];。我认为那就是你想要的。您使用的语法double y_OUT[nrow]用于静态分配,换句话说,在编译时必须知道数组的大小。

Sidenotes:当然,你需要记住释放你保留的内存。而这个问题是完全无关的主题IMO =)

+0

我无法重现@MrOperator转换为Eigen,你可以看看:http://stackoverflow.com/questions/43160609/converting-in-and-out-arguments-from-matlab-to-eigen- c-library-objects-types?谢谢 – Pedro77