【发布时间】:2013-03-07 02:59:08
【问题描述】:
我将两个 Eigen3 向量包装在一个模板化的 LineSegment<T,dim> 类中。你可以这样使用它:
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,该模板通常用作机器人系统的一部分,该系统主要将摄像机图像的 2D 线段转换为周围环境地图的 3D 线段。这种转换是双向的。我可以使用子类而不是 typedef 并添加特定的
to3和to2方法,但想知道是否有办法做到这一点。我见过的唯一一个调整数组大小的例子是动态大小的向量,例如VectorXd。 -
在Eigen2中,我相信你可以使用
.start<3>(),但我可能弄错了。