首页 > 解决方案 > 如何将复杂矩阵从 Matlab R2018a 转移到 Eigen

问题描述

我目前正在将矩阵的实部和虚部分别从 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 类型。

标签: c++matlabeigenmex

解决方案


如果我理解正确,mxComplexDouble则具有与 相同的布局std::complex<double>,因此您应该能够简单地转换:

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

参考:

-R2018aAPI 中,mxGetElementSize函数返回数据类型sizeof(std::complex<T>)为 的复合体。该值是API 中函数返回值的两倍。mxArrayT-R2017b

来自 MATLAB 文档页面“升级 MEX 文件以使用交错复杂 API”


推荐阅读