代码之家  ›  专栏  ›  技术社区  ›  greywolf82

特征自定义类和函数参数

  •  0
  • greywolf82  · 技术社区  · 5 年前

    我正在尝试用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-template类,但我不能将其与自定义类一起使用,因为如果使用ref,我将无法在foo内部调用custommethod。在本例中,我应该在示例中eigen::ref。避免使用ref是一个很大的问题,因为使用map和ref特征对象对于将动态矩阵强制转换为固定矩阵和执行其他强制转换操作非常重要。 最后一个问题:在这种情况下,使用Eigen的最佳策略是什么?

    1 回复  |  直到 5 年前
        1
  •  2
  •   ggael    5 年前

    至少有三种方法:

    1. 摆脱 MyVectorType 并使 customMethod 一个成员 MatrixBase 通过 plugin 机制。

    2. 摆脱 肌电型 并使 定制方法 自由功能。

    3. 专门从事 Eigen::Ref<MyVectorType> 让它继承 Ref<MyVectorType::Base> 及其构造函数,添加 定制方法 方法并通过调用内部自由函数对这两个方法进行因式分解 customMethod_impl .