c++ complex Eigen::VectorX返回视图到真实的或虚部

jmo0nnb3  于 2023-11-19  发布在  其他
关注(0)|答案(1)|浏览(79)

我有一个Eigen::VectorX<std::complex<RealType>> x,根据一些参数,我想返回x.real()x.imag()。我不想返回这个作为Eigen::VectorX<RealType>,因为该操作将需要堆分配,它将足以返回某种视图,因为x的存储可以被认为是持久的。
有没有办法在这两种情况下都返回一个轻量级的视图?不幸的是,x.real()x.imag()有不同的返回类型。我目前的解决方案是传递一个Eigen::VectorX<RealType>& x,这至少可以防止不必要的堆分配,但仍然是不必要的复制操作。

bxgwgixi

bxgwgixi1#

你可以创建一个strided map,第一个元素指向第一个真实的值或第一个虚值(未经测试的代码):

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());
}

字符串

相关问题