2014-02-13 2 views
3

Я пытаюсь использовать Eigen-библиотеку для C++, которую я хочу сделать в файл mex в Matlab. Я сломал код ниже его сути. Мне нужно сделать вектор возврата, длина которого соответствует количеству строк из входной матрицы.Использование собственных векторов в файлах mex Matlab

С кодом ниже я получаю follwing ошибки при компиляции, соответствующей линии:

double y_OUT[nrow] = {};

  • ошибка C2057: ожидается постоянное выражение-ошибки
  • ошибка C2466: не может выделить массив постоянный размер 0

Я не могу понять, почему я не могу выделить вектор длины 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

Вы в состоянии исправить свой код? Можете ли вы обновить его до рабочей версии? Я не могу создать Eigen Matrix из входного параметра 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

Смежные вопросы