在 MEX 函数中将特征复数矩阵返回到 MATLAB,无需额外复制

2023-12-10

这个问题演示如何使用映射对象将双精度矩阵返回到 MATLAB。

以下适用于非复杂数据:

double *outputPtr;
plhs[0] = mxCreateDoubleMatrix((mwSize)n, (mwSize)m, mxREAL);
outputPtr = mxGetPr(plhs[0]);
Map<MatrixXd> output(outputPtr, n, m);

由于 MATLAB 分别存储矩阵的实数和复数元素而不是交错存储,因此我认为您不能直接映射到MatrixXcd。这就是我正在尝试的,但它不会写入数据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);

我认为问题在于它将这些地图中的数据复制到outputMat。因此,这不仅在初始化时进行了不必要的复制,而且对以这种方式分配的矩阵的更改也不会触及输出指针处的数据。

有没有一种方法可以初始化输出矩阵,使其实部和虚部数据存储在mxGetPr(plhs[0]) and 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);

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 MEX 函数中将特征复数矩阵返回到 MATLAB,无需额外复制 的相关文章

随机推荐