gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 18:27:19 27 4
gpt4 key购买 nike

我在 Eigen3 库中有一些复杂、密集的 vector/矩阵,我想将实部和虚部提取到单独的数组中。在 Matlab 中,我可以做类似的事情

cplxFoo = [1, 1i; -1i -1]
re = real(cplxFoo)
im = imag(cplxFoo)

预期 yield

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

有没有类似 real() 的东西和 imag() Eigen3 中的 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();
}
}

它有效,我什至可以将它放入一个函数中,但我不得不自己进行循环矢量化、展开等操作,而且我必须制作一个额外的拷贝。

我想做的是包装几个 Map<MatrixXd>围绕cplxFoo迈出适当的步伐得到实部和虚部。但问题是 MatrixXcd 的元素是std::complex<double> ,我不确定它的布局是什么。我的猜测std::complex<T>基本上布局像struct {T real; T imag;};这样当你制作一个 std::complex<T> 的数组时,实部和虚部被紧密地打包和交错。 (这似乎也是 this SO question 的共识),但这是否由 C++ 标准保证? AFAICT,兼容的 C++ 编译器可以将其布局为 struct {T imag; T real;}; (注意改变的顺序),或者更奇特的东西,比如

class {
T radius;
T angle;

public:
T real() const { return radius * cos(angle); }
T imag() const { return radius * sin(angle); }
/* ... */
};

所以,可以包裹几个 Map<MatrixXd> 吗?围绕cplxFoo迈出适当的步伐?如果是这样,我该如何正确设置步幅?

或者,是否有任何方法可以让 Eigen 的复杂数据类型为实部和虚部使用单独的内存块?

就其值(value)而言,我需要这样做的原因是因为我需要将 Eigen 库与 MATLAB 连接起来,MATLAB 只能处理实部和虚部的单独数组,不能以任何方式交错。

最佳答案

这很简单,只需使用 .real().imag() View 即可:

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

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

关于c++ - 如何在 Eigen3 库中有效地提取复数矩阵的实部/虚部?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22323307/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com