我将两个Eigen3矢量包装在模板LineSegment<T,dim>
类中。你可以这样使用它:如何调整Eigen3中的矢量大小
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的问题,是关系到模板。
尺寸变化的期望语义是什么?投影到第一个坐标上并在新坐标中用零值展开? – us2012 2013-03-18 17:21:51
@ us2012,该模板通常用作机器人系统的一部分,该系统主要将来自摄像机图像的2D线段转换为其周围地图的3D线段。这种转换是双向的。我可以使用子类而不是typedefs并添加特定的'to3'和'to2'方法,但是想知道是否有这样做的方法。我看到的调整数组大小的唯一例子是动态大小的向量,例如'VectorXd'。 – 2013-03-18 17:30:30
在Eigen2中,我相信你可以使用'.start <3>()',但我可能会误解。 – 2013-03-18 17:34:16