我正在尝试将Eigen库用于C++,并将其制作成Matlab中的mex文件。我将代码分解为下面的要点。我需要制作一个返回 vector ,该 vector 的长度与输入矩阵的行数相对应。

在下面的代码中,我得到了与该行相对应的编译错误:
double y_OUT[nrow] = {};

  • 错误C2057:预期常量表达式错误
  • 错误C2466:无法分配恒定大小为0的数组

  • 我不知道为什么我不能分配长度为nrow的 vector 。
    通过取消注释特定行并打印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;
        }
    

    最佳答案

    您没有在其中分配任何内容。 double y_OUT[nrow] = {};行包含两个错误。如错误消息所述。

  • nrow不是constexpr。无法在编译时进行评估。
  • 大括号初始化程序的
  • ,建议 vector 包含0元素,这也没有意义。

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

    旁注:当然,您需要记住释放您保留的内存。并且该问题与主题IMO =)完全无关

    关于c++ - 在Matlab mex文件中使用 Eigen vector ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21751154/

    10-10 15:02