matlab分离实部虚部,c – 如何在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

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

for(size_t i=0; i

re(i,j) = cplxFoo(i,j).real();

im(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的复杂数据类型为真实和虚部使用单独的内存块?

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

  • 1
    点赞
  • 0
    收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:1024 设计师:我叫白小胖 返回首页
评论
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值