Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在Eigen3库中有效地提取复矩阵的实部/虚部?_C++_Matlab_Eigen3 - Fatal编程技术网

C++ 如何在Eigen3库中有效地提取复矩阵的实部/虚部?

C++ 如何在Eigen3库中有效地提取复矩阵的实部/虚部?,c++,matlab,eigen3,C++,Matlab,Eigen3,我在Eigen3库中有一些复杂、密集的向量/矩阵,我想将实部和虚部提取到单独的数组中。在Matlab中,我可以做如下操作 cplxFoo = [1, 1i; -1i -1] re = real(cplxFoo) im = imag(cplxFoo) 预期收益 cplxFoo = 1.0000 + 0.0000i 0.0000 + 1.0000i 0.0000 - 1.0000i -1.0000 + 0.0000i re = 1 0 0 -1

我在Eigen3库中有一些复杂、密集的向量/矩阵,我想将实部和虚部提取到单独的数组中。在Matlab中,我可以做如下操作

cplxFoo = [1, 1i; -1i -1]
re = real(cplxFoo)
im = imag(cplxFoo)
预期收益

cplxFoo =
   1.0000 + 0.0000i   0.0000 + 1.0000i
   0.0000 - 1.0000i  -1.0000 + 0.0000i
re =
     1     0
     0    -1
im =
     0     1
    -1     0
在Eigen3中是否有类似于
real()
imag()
的Matlab函数

现在,我知道唯一能起作用的是类似于

MatrixXcd cplxFoo = ...;
MatrixXd re(cplxFoo.rows(), cplxFoo.cols());
MatrixXd im(cplxFoo.rows(), cplxFoo.cols());

for(size_t j=0; j<cplxFoo.cols(); ++j) {
    for(size_t i=0; i<cplxFoo.rows(); ++i) {
        re(i, j) = cplxFoo(i,j).real();
        im(i, j) = cplxFoo(i,j).imag();
    }
}
那么,围绕
cplxFoo
,以适当的步幅来包装几张
Map
行吗?如果是,如何正确设置跨步

或者,有没有办法让Eigen的复杂数据类型为实部和虚部使用单独的内存块


出于价值考虑,我需要这样做的原因是因为我需要将Egeng库与MATLAB接口,MATLAB只能处理实部和虚部的单独数组,不能以任何方式交错。

这很简单,只需使用
.real()
视图即可

MatrixXcd M;
MatrixXd r, i;
r = M.real();
i = M.imag();

请注意,您可以在表达式中使用
M.real()
,而无需将其复制到
MatrixXd

std::complex
的布局保证与包含两个
T
值(实数后跟虚部)的数组兼容,并保证数组按预期进行泛化。(但我对Eigen的了解还不够,无法回答其他问题)。如果我没有把文档弄错
cplxFoo.imag()
cplxFoo.real()
应该可以。你试过了吗?@anderas Hot该死,真管用!“我希望我能在文档中看到它,这样就可以省去我很多麻烦了。”安德斯,你的评论加上迈克的话完全回答了我的问题。
MatrixXcd M;
MatrixXd r, i;
r = M.real();
i = M.imag();