c++ - 如何将复杂矩阵从 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 类型。
解决方案
如果我理解正确,mxComplexDouble
则具有与 相同的布局std::complex<double>
,因此您应该能够简单地转换:
auto* PR = reinterpret_cast<std::complex<double>*>(mxGetComplexDoubles(prhs[1]));
参考:
在
-R2018a
API 中,mxGetElementSize
函数返回数据类型sizeof(std::complex<T>)
为 的复合体。该值是API 中函数返回值的两倍。mxArray
T
-R2017b
来自 MATLAB 文档页面“升级 MEX 文件以使用交错复杂 API”
推荐阅读
- angular - 在 Angular 中关闭浏览器或选项卡时调用注销 api
- c++ - 为什么我在创建 task.json 后立即在 vscode 上收到错误?
- r - 列中特定行的最小值和最大值
- php - 使用 PHP 格式化 API Json 响应以在我的网站上很好地显示它
- servlets - 当我运行以下代码时,我收到一个 Servlet 404 错误
- android - Android存储库在库模块中不起作用
- javascript - 纯 JavaScript .onclick = function()
- javascript - 使用 math.parser() 或其他方法在带有 math.js 的函数中查找已定义变量(x、y、z 等)的总数
- r - 如何在 dplyr 中完全连接多个数据集(ncol 不匹配)
- python - 逐列填充模式