Как мне перенести сложную матрицу из Matlab R2018a в Eigen? - PullRequest
0 голосов
/ 27 апреля 2018

В настоящее время я импортирую реальные и мнимые части матрицы отдельно от Matlab в C ++. Затем я также отображаю действительные и мнимые части на Eigen отдельно. Я также выполняю расчет и отображаю окончательный результат отдельно, как показано ниже:

//import real and imaginary parts from matlab 
mwSize     M = mxGetM (prhs[1]);
mwSize     N = mxGetN (prhs[1]);
double  * PR = mxGetPr (prhs[1]);
double  * PI = mxGetPi (prhs[1]);

//map real and imaginary parts to Eigen
Map<Matrix<double,Dynamic,Dynamic,ColMajor> > Br (PR, M, N );
Map<Matrix<double,Dynamic,Dynamic,ColMajor> > Bi (PI, M, N );

//map real and imaginary parts of result 
plhs[0] = mxCreateDoubleMatrix(M, N, mxCOMPLEX);
Map<Matrix<double,Dynamic,Dynamic,ColMajor> > resultr (mxGetPr(plhs[0]), M, N);
Map<Matrix<double,Dynamic,Dynamic,ColMajor> > resulti (mxGetPi(plhs[0]), M, N);

//calculate real and imaginary parts of A*B separately
resultr=A*Br;
resulti=A*Bi;

Однако, начиная с R2018a, Matlab позволяет импортировать реальные и мнимые части вместе .

Как я могу это сделать? Я попробовал следующее:

//import complex matrix from matlab 
mwSize     N = mxGetN (prhs[1]);
mxComplexDouble  * PR = mxGetComplexDoubles (prhs[1]);

//map complex matrix to eigen
Map<Matrix<mxComplexDouble,Dynamic,Dynamic,ColMajor> > B (PR, M, N );

//map complex result
plhs[0] = mxCreateDoubleMatrix(M, N, mxCOMPLEX);
Map<Matrix<mxComplexDouble,Dynamic,Dynamic,ColMajor> > result (mxGetDoubles(plhs[0]), M, N);

//calculate real and imaginary parts together
result=A*B;

Но он не компилируется, потому что Eigen не нравится тип mxComplexDouble.

1 Ответ

0 голосов
/ 27 апреля 2018

Если я правильно понял, mxComplexDouble имеет тот же макет, что и std::complex<double>, так что вы можете просто произнести:

auto* PR = reinterpret_cast<std::complex<double>*>(mxGetComplexDoubles(prhs[1]));

Справка:

В API -R2018a функция mxGetElementSize возвращает sizeof(std::complex<T>) для комплекса mxArray с типом данных T. Это значение вдвое превышает значение, возвращаемое функцией в -R2017b API.

Со страницы документации MATLAB "Обновление файлов MEX для использования чередующегося сложного API"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...