我可以连接 Eigen::Vectors 的 std::tuple 吗?
Can I concatenate a std::tuple of Eigen::Vectors?
如果我有 std::tuple
个静态分配的 Eigen::Vector
(来自流行的 Eigen 库),例如
std::tuple<Eigen::Vector2f, Eigen::Vector3f, Eigen::Vector2f>
有什么方法可以将其变成三个向量连接起来的单个 Eigen::Vector7f
(即 Eigen::Matrix<float, 7, 1>
)?感觉我应该能够在编译时执行此操作,因为所有内容的大小和类型都是已知的。
你可以这样写:
template<int R1, int R2, int R3>
auto foo(std::tuple<
Eigen::Matrix<float,R1,1>,
Eigen::Matrix<float,R2,1>,
Eigen::Matrix<float,R3,1> > t)
{
Eigen::Matrix<float,R1+R2+R3,1> res;
res.template block<R1,1>(0,0) = std::get<0>(t);
res.template block<R2,1>(R1,0) = std::get<1>(t);
res.template block<R3,1>(R1+R2,0) = std::get<2>(t);
return res;
}
int main() {
Eigen::Vector2f v1;
v1 << 1,2;
Eigen::Vector3f v2;
v2 << 3,4,5;
std::cout << foo(std::make_tuple(v1,v2,v1)) << std::endl;
作为输出:
1,2,3,4,5,1,2
下面是更通用的版本,将多个向量作为元组组件:
template<class RES, int ... R, size_t ... Indices>
void concatenateHelper(RES& res,
const std::tuple< Eigen::Matrix<float,R,1>... >& t,
std::index_sequence<Indices...>)
{
int idx = 0;
int fakeArray [] = {(res.template block<R,1>(idx,0) = std::get<Indices>(t),idx += R,0)...};
static_cast<void>(fakeArray);
}
template<int ... R>
auto concatenate(const std::tuple< Eigen::Matrix<float,R,1> ... >& t)
{
Eigen::Matrix<float, (R + ...),1> res;
concatenateHelper(res,t,std::make_index_sequence<sizeof...(R)>{});
return res;
}
如果我有 std::tuple
个静态分配的 Eigen::Vector
(来自流行的 Eigen 库),例如
std::tuple<Eigen::Vector2f, Eigen::Vector3f, Eigen::Vector2f>
有什么方法可以将其变成三个向量连接起来的单个 Eigen::Vector7f
(即 Eigen::Matrix<float, 7, 1>
)?感觉我应该能够在编译时执行此操作,因为所有内容的大小和类型都是已知的。
你可以这样写:
template<int R1, int R2, int R3>
auto foo(std::tuple<
Eigen::Matrix<float,R1,1>,
Eigen::Matrix<float,R2,1>,
Eigen::Matrix<float,R3,1> > t)
{
Eigen::Matrix<float,R1+R2+R3,1> res;
res.template block<R1,1>(0,0) = std::get<0>(t);
res.template block<R2,1>(R1,0) = std::get<1>(t);
res.template block<R3,1>(R1+R2,0) = std::get<2>(t);
return res;
}
int main() {
Eigen::Vector2f v1;
v1 << 1,2;
Eigen::Vector3f v2;
v2 << 3,4,5;
std::cout << foo(std::make_tuple(v1,v2,v1)) << std::endl;
作为输出:
1,2,3,4,5,1,2
下面是更通用的版本,将多个向量作为元组组件:
template<class RES, int ... R, size_t ... Indices>
void concatenateHelper(RES& res,
const std::tuple< Eigen::Matrix<float,R,1>... >& t,
std::index_sequence<Indices...>)
{
int idx = 0;
int fakeArray [] = {(res.template block<R,1>(idx,0) = std::get<Indices>(t),idx += R,0)...};
static_cast<void>(fakeArray);
}
template<int ... R>
auto concatenate(const std::tuple< Eigen::Matrix<float,R,1> ... >& t)
{
Eigen::Matrix<float, (R + ...),1> res;
concatenateHelper(res,t,std::make_index_sequence<sizeof...(R)>{});
return res;
}