gpt4 book ai didi

c++ - 初始化 Eigen::Map 的 std::array

转载 作者:行者123 更新时间:2023-12-01 23:08:20 25 4
gpt4 key购买 nike

我正在编写一些数据的接口(interface) std::array<std::array<double,3>,4> a 。我希望能够将数据解释为 std::arrayEigen::Map<Eigen::Vector3d> 。如何初始化 std::array鉴于我没有默认的初始化程序?基本上,数组必须在构造函数中的 {} 之前构建。

class Interface{
Interface( std::array<std::array<double,3>,4>& a ) :
data_( a[0].data() ), // this works for initializing just the one
array_of_data_( /* what goes here? */ ) {}
protected:
Eigen::Map<Eigen::Vector3d> data_;
std::array<Eigen::Map<Eigen::Vector3d>,4> array_of_data_;
}

示例data_包含在内以演示如何从单个 std::array<double,3> 构建一张 map .

最佳答案

最明显的方法是在 in[index].data() 中重复 4 次,作为数组获取的所有元素:

class Interface {
public:
Interface( std::array<std::array<double,3>,4>& a ) :
data_( a[0].data() ), // this works for initializing just the one
array_of_data_{ Eigen::Map<Eigen::Vector3d>(a[0].data()),
Eigen::Map<Eigen::Vector3d>(a[1].data()),
Eigen::Map<Eigen::Vector3d>(a[2].data()),
Eigen::Map<Eigen::Vector3d>(a[3].data()) }
{}

但如果数组的第二个维度具有更大的值,则可能会很乏味。

您可以使用 std::index_sequence 并打包扩展来缩短它:

template<size_t D1, size_t D2, size_t ... idx>
auto makeMap(
std::array< std::array<double,D1>, D2>& in,
std::index_sequence<idx...> seq)
{
return std::array< Eigen::Map<Eigen::Vector3d>, D2>{
Eigen::Map<Eigen::Vector3d>(in[idx].data())...
};
}

template<size_t D1, size_t D2, size_t ... idx>
auto makeMap( std::array< std::array<double,D1>, D2>& in) {
return makeMap(in, std::make_index_sequence<D2>());
}

Working version on Compiler Explorer

关于c++ - 初始化 Eigen::Map 的 std::array,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59872290/

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