代码之家  ›  专栏  ›  技术社区  ›  R zu

从MatrixWrapper创建Eigensolver

  •  1
  • R zu  · 技术社区  · 5 年前

    如何构造 EigenSolver 从A MaxtrixWrapper ?

    测试(也在 godbolt.org )

    #include <Eigen/Eigen>
    using namespace Eigen;
    
    template<typename D>
    void f(const Eigen::DenseBase<D>& a) {
        const Eigen::MatrixWrapper<const D> a2(a.derived());
        Eigen::EigenSolver<typename Eigen::MatrixWrapper<const D>> 
        es(a2);
    }
    
    int main() {
        ArrayXXf a(3, 3);
        a = 1.0f;
        f(a);
    }
    

    第一错误:

    <...>/eigen3/Eigen/src/Eigenvalues/EigenSolver.h:71:10: error: 
    ‘Options’ is not a member of 
    ‘Eigen::EigenSolver<
        Eigen::MatrixWrapper<
            const Eigen::Array<float, -1, -1> 
        > 
     >::MatrixType {
     aka Eigen::MatrixWrapper<const Eigen::Array<float, -1, -1> >}’
         enum {
    
    1 回复  |  直到 5 年前
        1
  •  2
  •   chtz    5 年前

    你不想。解决者都想要一个简单的 Matrix<...> (或) Ref<Matrix<...> > )作为模板参数。你可以得到正确的 Matrix 使用类型:

    template<typename D>
    void f(const Eigen::DenseBase<D>& a) {
        Eigen::EigenSolver<typename D::PlainMatrix> es(a.derived().matrix());
    }
    

    这个 .derived().matrix() 实际上是可选的,因为 ArrayXXf 转换为 MatrixXf 隐含地。(Godbolt超时了——Eigensolver对于编译器来说相当重)。