2013-08-26 53 views
2

我发现与本征对象作为参数繁琐的功能设计。虽然Eigen Documentation中的信息很有帮助,但它为模板参数提供了一种尴尬的方法。假设,我们想写一个几何例程,如线平面交点。一个简单而透明的做法是:最佳实践作为参数

template<typename _Tp> 
bool planeLineIntersect(const Eigen::Matrix<_Tp, 3, 1>& planePoint, 
         const Eigen::Matrix<_Tp, 3, 1>& planeNormal, 
         const Eigen::Matrix<_Tp, 3, 1>& linePoint, 
         const Eigen::Matrix<_Tp, 3, 1>& lineDir, 
         Eigen::Matrix<_Tp, 3, 1>& intersectionPoint) 

这看起来比较悦目的人,看起来在这个可以学习,每个参数都必须是同一类型的3D矢量。但是,直接地,这不允许任何类型的Eigen表达式(我们必须为每个表达式调用Eigen :: Matrix构造函数,我们使用它)。因此,如果使用表达式,我们需要创建不必要的临时对象。

建议的解决方案是:

template<typename Derived1, typename Derived2, typename Derived3, typename Derived4, typename Derived5> 
bool planeLineIntersect(const Eigen::MatrixBase<Derived1>& planePoint, 
         const Eigen::MatrixBase<Derived2>& planeNormal, 
         const Eigen::MatrixBase<Derived3>& linePoint, 
         const Eigen::MatrixBase<Derived4>& lineDir, 
         const Eigen::MatrixBase<Derived5>& intersectionPoint) 

这并没有透露任何关于预计的矩阵,也没有哪个参数用于输入和输出,因为我们有一个常量播的intersectionPoint允许输出参数中的表达式。据我所知,这是允许所有功能参数中的Eigen表达式的唯一方法。尽管表达不够支持,但第一部分仍然看起来更可爱。

我的问题:

  1. 你会考虑第二代码片段在这个例子中的最佳解决方案?
  2. 你曾经使用的输出参数的常量播解决方案或者你认为这是不值得的透明度的损失?
  3. 您使用Eigen函数书写的哪些准则/最佳实践?

回答

1

对于这样小的固定大小的物体,我不费心思,并与第一溶液去。

这是很少的一个好方法具有输出功能参数。在你特定的情况下,一种方法是创建一个PlaneLineIntersection类,它的ctor将采用一个平面和一条线,存储交集的结果,然后提供访问器来查询计算结果(没有交集,它是一个点,一条线)。

顺便说一句,你有没有注意到的超平面和ParametrizedLine类征/几何模块? ParametrizedLine类有一个带HyperPlane的intersectionPoint成员(尽管它是有限的,因为它假设交集确实存在,并且它是一个点)。

+0

为什么你认为使用输出参数不是一个好方法?我发现一个函数对象为此目的有点臃肿。有或没有表达式,这样的对象将不得不为结果分配内存。另外,我需要额外的代码行来进行构建/初始化并读取结果。我在代码中不使用特征类型,因为我做了很多几何计算,并且需要将归一化的数量保持为最小(尽管这个函数不是那么好的例子)。 –