我将两个 Eigen3 vector 包装在一个模板化的 LineSegment<T,dim>
中类(class)。你可以像这样使用它:
typedef LineSegment<double,2> LineSegment2d;
typedef LineSegment<double,3> LineSegment3d;
typedef LineSegment<int,3> LineSegment3i;
它包含一个模板化的方法来改变组件的尺寸。这是修剪后的定义:
template<typename T,int dim>
struct LineSegment
{
public:
template<int newDim>
LineSegment<T,newDim> to() const
{
Eigen::Matrix<T,newDim,1> newp1;
Eigen::Matrix<T,newDim,1> newp2;
// TODO initialise newp1 and newp2 from d_p1 and d_p2
return LineSegment<T,newDim>(newp1, newp2);
}
// ... other members ...
protected:
Eigen::Matrix<T,dim,1> d_p1;
Eigen::Matrix<T,dim,1> d_p2;
}
所以我的问题是,如何组合返回值,如上所示?这应该支持增加和减少维度。
我尝试使用 Eigen3 resize(int)方法,但在没有看到有关混合矩阵大小的警告的情况下无法让它工作。
最终,这应该可行:
LineSegment2d ls2d;
LineSegment3d ls3d = ls2d.to<3>(); // increase dim
ls2d = ls3d.to<2>(); // decrease dim
我是 C++ 模板的新手,如果这不仅仅是一个 API 问题并且与模板相关,我将不胜感激。
最佳答案
首先,Eigen 的 resize
如果新元素数量与旧元素数量不同,方法会重新分配内存,无论是增长还是收缩,所以在这种情况下你会丢失数据
以下方法使用 .head<int>()
,这是 .start<int>()
的 Eigen3 版本,再加上一些模板编程,这样你就不必检查你是在缩小还是在增长:
#include <Eigen/Core>
template <bool COND, int A, int B>
struct IF
{
enum { val = A };
};
template <int A, int B>
struct IF<false, A, B>
{
enum { val = B };
};
template <int A, int B>
struct MIN : IF<A < B, A, B>
{
};
template <typename T,int dim,int newDim>
Eigen::Matrix<T,newDim,1> to(Eigen::Matrix<T,dim,1> p)
{
Eigen::Matrix<int,newDim,1> newp =
Eigen::Matrix<T,newDim,1>::Zero();
newp.template head< MIN<dim,newDim>::val >() =
p.template head< MIN<dim,newDim>::val >();
return newp;
}
使用这个,下面的程序:
#include <iostream>
int main()
{
Eigen::Vector2i p_2i(1,2);
Eigen::Vector3i p_3i(3,4,5);
std::cout << to<int, 2, 3>(p_2i) << std::endl << std::endl;
std::cout << to<int, 3, 2>(p_3i) << std::endl << std::endl;
}
给出输出:
1
2
0
3
4
关于c++ - 如何在 Eigen3 中调整 Vector 的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15482498/