我將兩個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