初始化 std::数组 of Eigen::Map



我正在为一些数据std::array<std::array<double,3>,4> a编写接口。我希望能够将数据解释为Eigen::Map<Eigen::Vector3d>std::array。如果我没有默认的初始值设定项,如何初始化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>构建一个地图。

显而易见的方法是重复 4 次in[index].data()因为数组获取的所有元素:

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

编译器资源管理器上的工作版本

相关内容

  • 没有找到相关文章

最新更新