我正在尝试使用Eigen替换我的代码中当前使用的矩阵库。我有几个像这样的类,它将自定义方法添加到基矩阵类。在此示例中,我将父类替换为Eigen:
#include <iostream>
#include <eigen3/Eigen/Dense>
class MyVectorType: public Eigen::Matrix<double, 3, 1> {
public:
MyVectorType(void) :
Eigen::Matrix<double, 3, 1>() {
}
typedef Eigen::Matrix<double, 3, 1> Base;
// This constructor allows you to construct MyVectorType from Eigen expressions
template<typename OtherDerived>
MyVectorType(const Eigen::MatrixBase<OtherDerived>& other) :
Eigen::Matrix<double, 3, 1>(other) {
}
// This method allows you to assign Eigen expressions to MyVectorType
template<typename OtherDerived>
MyVectorType & operator=(const Eigen::MatrixBase<OtherDerived>& other) {
this->Base::operator=(other);
return *this;
}
void customMethod() {
//bla bla....
}
};
最大的问题是,在方法中管理自定义类并不是很容易。示例:
void foo(MyVectorType& a) {
....
a.customMethod();
}
void foo(Eigen::Ref<MyVectorType::Base> a) {
....
a.customMethod(); <---can't call customMethod here
}
Eigen::Matrix<double, -1, -1, 0, 15, 15> m(3,1);
foo(m); <---can't call it with m;
Eigen::Map<Matrix<double, 3, 1> > map(m.data(), 3, 1);
Eigen::Ref<Matrix<double, 3, 1> > ref(map);
foo(ref); <---it works but I can't call custom method
通常Eigen提供Ref模板类,但是我不能将其与自定义类一起使用,因为如果使用Ref,则在此示例中我将无法在foo内部调用customMethod,我应在示例中使用Eigen :: Ref。避免使用Ref是一个大问题,因为使用Map和Ref Eigen对象对于将动态矩阵强制转换为固定矩阵并执行其他强制转换操作非常重要。 最后一个问题:在这种情况下使用Eigen的最佳策略是什么?
答案 0 :(得分:2)
至少有三种方法:
通过plugin机制摆脱MyVectorType
并使customMethod
成为MatrixBase
的成员。
摆脱MyVectorType
,并使customMethod
成为自由函数。
通过让Eigen::Ref<MyVectorType>
继承Ref<MyVectorType::Base>
及其构造函数来专门化customMethod
,添加一个customMethod_impl
方法并通过调用内部自由函数data = [
('trojan', 'virus', 0.4731800100841465),
('elb', 'Ebola', 0.3722390506633956)
]
middle_data = []
for inside_list in data:
middle = len(inside_list)/2
middle_data.append(inside_list[middle])
print(middle_data)
将这两个方法分解。