C++ 在mex函数中向matlab返回特征复矩阵,无需额外复制

C++ 在mex函数中向matlab返回特征复矩阵,无需额外复制,c++,matlab,eigen,mex,eigen3,C++,Matlab,Eigen,Mex,Eigen3,这个问题展示了如何使用map对象将双矩阵返回到matlab。 以下内容适用于非复杂数据 double *outputPtr; plhs[0] = mxCreateDoubleMatrix((mwSize)n, (mwSize)m, mxREAL); outputPtr = mxGetPr(plhs[0]); Map<MatrixXd> output(outputPtr, n, m); double*outputPtr; plhs[0]=mxCreateDoubleMatrix((m

这个问题展示了如何使用map对象将双矩阵返回到matlab。 以下内容适用于非复杂数据

double *outputPtr;
plhs[0] = mxCreateDoubleMatrix((mwSize)n, (mwSize)m, mxREAL);
outputPtr = mxGetPr(plhs[0]);
Map<MatrixXd> output(outputPtr, n, m);
double*outputPtr;
plhs[0]=mxCreateDoubleMatrix((mwSize)n,(mwSize)m,mxREAL);
outputPtr=mxGetPr(plhs[0]);
映射输出(outputPtr,n,m);
因为matlab单独存储矩阵的实元素和复元素,而不是交错存储,所以我认为不能直接映射到MatrixCD。这是我正在尝试的,但它不会写入plhs[0]处的数据

double *outputReal, *outputImag;
plhs[0] = mxCreateDoubleMatrix((mwSize)n, (mwSize)m, mxCOMPLEX);
outputReal = mxGetPr(plhs[0]);
outputImag = mxGetPi(plhs[0]);
MatrixXcd outputMat(n,m);
outputMat.real() = Map<MatrixXd>(outputReal,n,m);
outputMat.imag() = Map<MatrixXd>(outputImag,n,m);
double*outputReal,*outputImag;
plhs[0]=mxCreateDoubleMatrix((mwSize)n,(mwSize)m,mxCOMPLEX);
outputReal=mxGetPr(plhs[0]);
outputImag=mxGetPi(plhs[0]);
矩阵xCD输出矩阵(n,m);
outputMat.real()=Map(outputReal,n,m);
outputMat.imag()=Map(outputImag,n,m);
我认为问题在于它将这些映射中的数据复制到outputMat的实部和虚部。因此,这不仅会在初始化时进行不必要的复制,而且对以这种方式分配的矩阵所做的更改不会触及输出指针处的数据


有没有一种方法可以初始化输出矩阵,使其实数据和虚数据存储在mxGetPr(plhs[0])和mxGetPi(plhs[0])?

感谢Cris Luengo为我指明了正确的方向。这是我要做的

plhs[0] = mxCreateDoubleMatrix((mwSize)n, (mwSize)m, mxCOMPLEX);
auto* Poutput = reinterpret_cast<complex<double>*>(mxGetComplexDoubles(plhs[0]));
Map<MatrixXcd> output(Poutput, n, m);
plhs[0]=mxCreateDoubleMatrix((mwSize)n,(mwSize)m,mxCOMPLEX);
auto*Poutput=reinterpret_cast(mxGetComplexDoubles(plhs[0]);
映射输出(Poutput,n,m);

然后在编译时,请确保为mex提供-R2018a标志,该标志将为交错复数数据生成。

Eigen目前仅支持交错存储复数值,因此需要设置两个单独的输出映射。因为MATLAB R2018a复数是交错存储的。您需要使用
-R2018a
选项编译MEX文件,否则复杂数据将被复制到单独的实数组和虚数组中,以实现向后兼容性。
double *outputPtr;
plhs[0] = mxCreateDoubleMatrix((mwSize)n, (mwSize)m, mxREAL);
outputPtr = mxGetPr(plhs[0]);
Map<MatrixXd> output(outputPtr, n, m);