complex Eigen::VectorX 返回实部或虚部视图

问题描述 投票:0回答:1

我有一个

Eigen::VectorX<std::complex<RealType>> x
,根据某些参数,我想返回
x.real()
x.imag()
。我不想将其作为
Eigen::VectorX<RealType>
返回,因为该操作需要堆分配,并且返回某种视图就足够了,因为
x
的存储可以被视为持久的。

有没有办法在这两种情况下返回轻量级视图?不幸的是,

x.real()
x.imag()
有不同的返回类型。我当前的解决方案是传递一个
Eigen::VectorX<RealType>& x
,这至少可以防止不必要的堆分配,但仍然是不必要的复制操作。

c++ c++20 eigen3
1个回答
0
投票

您可以创建一个跨步映射,其中第一个元素指向第一个实值或第一个虚值(未经测试的代码):

template<typename RealType>
using RealOrImagView = Eigen::Map<const Eigen::VectorX<RealType>, Eigen::Unaligned, Eigen::InnerStride<2> >;

// double can be a template parameter, of course
RealOrImagView<double> foo(const Eigen::VectorXcd& input, bool real)
{
    return RealOrImagView<double>(reinterpret_cast<const double*>(input.data()) + (!real), input.size());
}
© www.soinside.com 2019 - 2024. All rights reserved.