2014-02-13 32 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