在Matlab的mex文件中使用特征向量

3
我正在尝试使用Eigen库来编写一个C++程序,我想将其制作成Matlab中的mex文件。我已经将代码简化为下面的基本要素。我需要生成一个返回向量,其长度对应于输入矩阵的行数。
在下面的代码中,我在编译时遇到了以下与该行相对应的错误: double y_OUT[nrow] = {};
  • error C2057: 预期常量表达式
  • error 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;
    }

你已经能够修正你的代码了吗?你能够更新到一个可工作的版本吗?我无法从mex matlab输入参数中创建一个Eigen矩阵。 - Pedro77
1个回答

6
您在那里没有分配任何东西。该行double y_OUT[nrow] = {};包含两个错误。正如错误消息所描述的那样。
  1. nrow不是constexpr。 它无法在编译时评估。
  2. 通过您建议的花括号初始化程序,向量具有0个元素,这也没有意义。
动态分配的正确语法是:double* y_OUT = new double [nrow];。我想这就是你想要的。您使用的语法double y_OUT [nrow]用于静态分配,换句话说,数组的大小必须在编译时知道。
附注:当然,您需要记住释放您保留的内存。而且,问题与主题完全无关=)

我无法复现@MrOperator关于将代码转换为Eigen的过程,你能看一下这里吗:http://stackoverflow.com/questions/43160609/converting-in-and-out-arguments-from-matlab-to-eigen-c-library-objects-types?谢谢 - Pedro77

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接