Eigen库笔记整理(一)

首先熟悉Eigen库的用途,自行百度。

引入头文件:

// Eigen 部分
#include <Eigen/Core>
// 稠密矩阵的代数运算(逆,特征值等)
#include <Eigen/Dense>

定义变量:

Eigen 中所有向量和矩阵都是Eigen::Matrix,它是一个模板类。

它的前三个参数为:数据类型,行,列

Eigen 通过 typedef 提供了许多内置类型,不过底层仍是Eigen::Matrix

例如:

Eigen::Matrix<float, 2, 3> matrix_23;  // 声明一个2*3的float矩阵
Eigen::Vector3d v_3d;  //Vector3d 实质上是 Eigen::Matrix<double, 3, 1>
Eigen::Matrix3d matrix_33 ;//Matrix3d 实质上是 Eigen::Matrix<double, 3, 3>

初始化:

matrix_33 = Eigen::Matrix3d::Zero(); //初始化为零
matrix_23 << 1, 2, 3, 4, 5, 6;  //输入数据(初始化)
matrix_33 = Eigen::Matrix3d::Random();      // 随机数矩阵

访问数据:

cout <<matrix_23 << endl; // 输出

// 用()访问矩阵中的元素
    for (int i=0; i<2; i++) {
        for (int j=0; j<3; j++)
            cout<<matrix_23(i,j)<<"\t";
        cout<<endl;
    }

矩阵的乘法:

注意:

1、在Eigen里不能混合两种不同类型的矩阵,Eigen不会帮我们自动类型转换。我们需要自己进行显示转换。

如果我们不显式的进行类型转换,

Eigen::Matrix<double, 2, 1> result_wrong_type = matrix_23 * v_3d;

则报错如下:(有时候编译器就是这么不友好的提示一堆错误,也不直接告诉你是因为类型不对,摊手┑( ̄Д  ̄)┍)

/home/wy/workdir/slambook/ch3/useEigen/build> make -j2
Scanning dependencies of target eigenMatrix
[ 50%] Building CXX object CMakeFiles/eigenMatrix.dir/eigenMatrix.cpp.o
In file included from /usr/include/eigen3/Eigen/Core:348:0,
                 from /home/wy/workdir/slambook/ch3/useEigen/eigenMatrix.cpp:5:
/usr/include/eigen3/Eigen/src/Core/Product.h: In instantiation of ‘struct Eigen::internal::product_result_scalar<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, Eigen::DenseShape, Eigen::DenseShape>’:
/usr/include/eigen3/Eigen/src/Core/Product.h:78:73:   required fromstruct Eigen::internal::traits<Eigen::Product<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0> >/usr/include/eigen3/Eigen/src/Core/Product.h:151:7:   required fromclass Eigen::internal::dense_product_base<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0, 3>/usr/include/eigen3/Eigen/src/Core/Product.h:183:7:   required fromclass Eigen::ProductImpl<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0, Eigen::Dense>/usr/include/eigen3/Eigen/src/Core/Product.h:107:7:   required fromclass Eigen::Product<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0>/home/wy/workdir/slambook/ch3/useEigen/eigenMatrix.cpp:52:65:   required from here
/usr/include/eigen3/Eigen/src/Core/Product.h:41:98: error: no type named ‘ReturnType’ instruct Eigen::internal::scalar_product_traits<float, double>’
   typedef typename scalar_product_traits<typename Lhs::Scalar, typename Rhs::Scalar>::ReturnType Scalar;
                                                                                                  ^
In file included from /usr/include/eigen3/Eigen/Core:344:0,
                 from /home/wy/workdir/slambook/ch3/useEigen/eigenMatrix.cpp:5:
/usr/include/eigen3/Eigen/src/Core/DenseBase.h: In instantiation of ‘class Eigen::DenseBase<Eigen::Product<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0> >’:
/usr/include/eigen3/Eigen/src/Core/MatrixBase.h:48:34:   required fromclass Eigen::MatrixBase<Eigen::Product<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0> >/usr/include/eigen3/Eigen/src/Core/Product.h:151:7:   required fromclass Eigen::internal::dense_product_base<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0, 3>/usr/include/eigen3/Eigen/src/Core/Product.h:183:7:   required fromclass Eigen::ProductImpl<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0, Eigen::Dense>/usr/include/eigen3/Eigen/src/Core/Product.h:107:7:   required fromclass Eigen::Product<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0>/home/wy/workdir/slambook/ch3/useEigen/eigenMatrix.cpp:52:65:   required from here
/usr/include/eigen3/Eigen/src/Core/DenseBase.h:78:25: error: using-declaration for non-member at class scope
     using Base::operator*;
                         ^
/usr/include/eigen3/Eigen/src/Core/DenseBase.h:79:25: error: using-declaration for non-member at class scope
     using Base::operator/;
                         ^
/usr/include/eigen3/Eigen/src/Core/DenseBase.h:80:17: error: using-declaration for non-member at class scope
     using Base::derived;
                 ^
/usr/include/eigen3/Eigen/src/Core/DenseBase.h:81:17: error: using-declaration for non-member at class scope
     using Base::const_cast_derived;
                 ^
/usr/include/eigen3/Eigen/src/Core/DenseBase.h:82:17: error: using-declaration for non-member at class scope
     using Base::rows;
                 ^
/usr/include/eigen3/Eigen/src/Core/DenseBase.h:83:17: error: using-declaration for non-member at class scope
     using Base::cols;
                 ^
/usr/include/eigen3/Eigen/src/Core/DenseBase.h:84:17: error: using-declaration for non-member at class scope
     using Base::size;
                 ^
/usr/include/eigen3/Eigen/src/Core/DenseBase.h:85:17: error: using-declaration for non-member at class scope
     using Base::rowIndexByOuterInner;
                 ^
/usr/include/eigen3/Eigen/src/Core/DenseBase.h:86:17: error: using-declaration for non-member at class scope
     using Base::colIndexByOuterInner;
                 ^
/usr/include/eigen3/Eigen/src/Core/DenseBase.h:87:17: error: using-declaration for non-member at class scope
     using Base::coeff;
                 ^
/usr/include/eigen3/Eigen/src/Core/DenseBase.h:88:17: error: using-declaration for non-member at class scope
     using Base::coeffByOuterInner;
                 ^
/usr/include/eigen3/Eigen/src/Core/DenseBase.h:89:26: error: using-declaration for non-member at class scope
     using Base::operator();
                          ^
/usr/include/eigen3/Eigen/src/Core/DenseBase.h:90:26: error: using-declaration for non-member at class scope
     using Base::operator[];
                          ^
/usr/include/eigen3/Eigen/src/Core/DenseBase.h:91:17: error: using-declaration for non-member at class scope
     using Base::x;
                 ^
/usr/include/eigen3/Eigen/src/Core/DenseBase.h:92:17: error: using-declaration for non-member at class scope
     using Base::y;
                 ^
/usr/include/eigen3/Eigen/src/Core/DenseBase.h:93:17: error: using-declaration for non-member at class scope
     using Base::z;
                 ^
/usr/include/eigen3/Eigen/src/Core/DenseBase.h:94:17: error: using-declaration for non-member at class scope
     using Base::w;
                 ^
/usr/include/eigen3/Eigen/src/Core/DenseBase.h:95:17: error: using-declaration for non-member at class scope
     using Base::stride;
                 ^
/usr/include/eigen3/Eigen/src/Core/DenseBase.h:96:17: error: using-declaration for non-member at class scope
     using Base::innerStride;
                 ^
/usr/include/eigen3/Eigen/src/Core/DenseBase.h:97:17: error: using-declaration for non-member at class scope
     using Base::outerStride;
                 ^
/usr/include/eigen3/Eigen/src/Core/DenseBase.h:98:17: error: using-declaration for non-member at class scope
     using Base::rowStride;
                 ^
/usr/include/eigen3/Eigen/src/Core/DenseBase.h:99:17: error: using-declaration for non-member at class scope
     using Base::colStride;
                 ^
In file included from /usr/include/eigen3/Eigen/Core:345:0,
                 from /home/wy/workdir/slambook/ch3/useEigen/eigenMatrix.cpp:5:
/usr/include/eigen3/Eigen/src/Core/MatrixBase.h: In instantiation of ‘class Eigen::MatrixBase<Eigen::Product<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0> >’:
/usr/include/eigen3/Eigen/src/Core/Product.h:151:7:   required fromclass Eigen::internal::dense_product_base<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0, 3>/usr/include/eigen3/Eigen/src/Core/Product.h:183:7:   required fromclass Eigen::ProductImpl<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0, Eigen::Dense>/usr/include/eigen3/Eigen/src/Core/Product.h:107:7:   required fromclass Eigen::Product<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0>/home/wy/workdir/slambook/ch3/useEigen/eigenMatrix.cpp:52:65:   required from here
/usr/include/eigen3/Eigen/src/Core/MatrixBase.h:70:17: error: no members matching ‘Eigen::MatrixBase<Eigen::Product<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0> >::Base {aka Eigen::DenseBase<Eigen::Product<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0> >}::derived’ in ‘Eigen::MatrixBase<Eigen::Product<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0> >::Base {aka class Eigen::DenseBase<Eigen::Product<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0> >}’
     using Base::derived;
                 ^
/usr/include/eigen3/Eigen/src/Core/MatrixBase.h:71:17: error: no members matching ‘Eigen::MatrixBase<Eigen::Product<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0> >::Base {aka Eigen::DenseBase<Eigen::Product<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0> >}::const_cast_derived’ in ‘Eigen::MatrixBase<Eigen::Product<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0> >::Base {aka class Eigen::DenseBase<Eigen::Product<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0> >}’
     using Base::const_cast_derived;
                 ^
/usr/include/eigen3/Eigen/src/Core/MatrixBase.h:72:17: error: no members matching ‘Eigen::MatrixBase<Eigen::Product<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0> >::Base {aka Eigen::DenseBase<Eigen::Product<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0> >}::rows’ in ‘Eigen::MatrixBase<Eigen::Product<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0> >::Base {aka class Eigen::DenseBase<Eigen::Product<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0> >}’
     using Base::rows;
                 ^
/usr/include/eigen3/Eigen/src/Core/MatrixBase.h:73:17: error: no members matching ‘Eigen::MatrixBase<Eigen::Product<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0> >::Base {aka Eigen::DenseBase<Eigen::Product<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0> >}::cols’ in ‘Eigen::MatrixBase<Eigen::Product<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0> >::Base {aka class Eigen::DenseBase<Eigen::Product<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0> >}’
     using Base::cols;
                 ^
/usr/include/eigen3/Eigen/src/Core/MatrixBase.h:74:17: error: no members matching ‘Eigen::MatrixBase<Eigen::Product<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0> >::Base {aka Eigen::DenseBase<Eigen::Product<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0> >}::size’ in ‘Eigen::MatrixBase<Eigen::Product<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0> >::Base {aka class Eigen::DenseBase<Eigen::Product<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0> >}’
     using Base::size;
                 ^
/usr/include/eigen3/Eigen/src/Core/MatrixBase.h:75:17: error: no members matching ‘Eigen::MatrixBase<Eigen::Product<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0> >::Base {aka Eigen::DenseBase<Eigen::Product<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0> >}::coeff’ in ‘Eigen::MatrixBase<Eigen::Product<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0> >::Base {aka class Eigen::DenseBase<Eigen::Product<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0> >}’
     using Base::coeff;
                 ^
/usr/include/eigen3/Eigen/src/Core/MatrixBase.h:76:17: error: no members matching ‘Eigen::MatrixBase<Eigen::Product<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0> >::Base {aka Eigen::DenseBase<Eigen::Product<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0> >}::coeffRef’ in ‘Eigen::MatrixBase<Eigen::Product<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0> >::Base {aka class Eigen::DenseBase<Eigen::Product<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0> >}’
     using Base::coeffRef;
                 ^
/usr/include/eigen3/Eigen/src/Core/MatrixBase.h:78:17: error: no members matching ‘Eigen::MatrixBase<Eigen::Product<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0> >::Base {aka Eigen::DenseBase<Eigen::Product<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0> >}::eval’ in ‘Eigen::MatrixBase<Eigen::Product<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0> >::Base {aka class Eigen::DenseBase<Eigen::Product<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0> >}’
     using Base::eval;
                 ^
/usr/include/eigen3/Eigen/src/Core/MatrixBase.h:81:25: error: no members matching ‘Eigen::MatrixBase<Eigen::Product<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0> >::Base {aka Eigen::DenseBase<Eigen::Product<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0> >}::operator*=’ in ‘Eigen::MatrixBase<Eigen::Product<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0> >::Base {aka class Eigen::DenseBase<Eigen::Product<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0> >}’
     using Base::operator*=;
                         ^
/usr/include/eigen3/Eigen/src/Core/MatrixBase.h:82:25: error: no members matching ‘Eigen::MatrixBase<Eigen::Product<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0> >::Base {aka Eigen::DenseBase<Eigen::Product<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0> >}::operator/=’ in ‘Eigen::MatrixBase<Eigen::Product<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0> >::Base {aka class Eigen::DenseBase<Eigen::Product<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0> >}’
     using Base::operator/=;
                         ^
/usr/include/eigen3/Eigen/src/Core/MatrixBase.h:83:25: error: no members matching ‘Eigen::MatrixBase<Eigen::Product<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0> >::Base {aka Eigen::DenseBase<Eigen::Product<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0> >}::operator*’ in ‘Eigen::MatrixBase<Eigen::Product<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0> >::Base {aka class Eigen::DenseBase<Eigen::Product<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0> >}’
     using Base::operator*;
                         ^
/usr/include/eigen3/Eigen/src/Core/MatrixBase.h:84:25: error: no members matching ‘Eigen::MatrixBase<Eigen::Product<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0> >::Base {aka Eigen::DenseBase<Eigen::Product<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0> >}::operator/’ in ‘Eigen::MatrixBase<Eigen::Product<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0> >::Base {aka class Eigen::DenseBase<Eigen::Product<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0> >}’
     using Base::operator/;
                         ^
In file included from /usr/include/eigen3/Eigen/Core:62:0,
                 from /home/wy/workdir/slambook/ch3/useEigen/eigenMatrix.cpp:5:
/usr/include/eigen3/Eigen/src/Core/Product.h: In instantiation of ‘class Eigen::ProductImpl<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0, Eigen::Dense>’:
/usr/include/eigen3/Eigen/src/Core/Product.h:107:7:   required fromclass Eigen::Product<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0>/home/wy/workdir/slambook/ch3/useEigen/eigenMatrix.cpp:52:65:   required from here
/usr/include/eigen3/Eigen/src/Core/util/Macros.h:790:15: error: no members matching ‘Eigen::ProductImpl<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0, Eigen::Dense>::Base {aka Eigen::internal::dense_product_base<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0, 3>}::derived’ in ‘Eigen::ProductImpl<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0, Eigen::Dense>::Base {aka class Eigen::internal::dense_product_base<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0, 3>}’
   using Base::derived; \
               ^
/usr/include/eigen3/Eigen/src/Core/util/Macros.h:796:3: note: in expansion of macro ‘EIGEN_GENERIC_PUBLIC_INTERFACE’
   EIGEN_GENERIC_PUBLIC_INTERFACE(Derived) \
   ^
/usr/include/eigen3/Eigen/src/Core/Product.h:191:5: note: in expansion of macro ‘EIGEN_DENSE_PUBLIC_INTERFACE’
     EIGEN_DENSE_PUBLIC_INTERFACE(Derived)
     ^
/usr/include/eigen3/Eigen/src/Core/util/Macros.h:791:15: error: no members matching ‘Eigen::ProductImpl<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0, Eigen::Dense>::Base {aka Eigen::internal::dense_product_base<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0, 3>}::const_cast_derived’ in ‘Eigen::ProductImpl<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0, Eigen::Dense>::Base {aka class Eigen::internal::dense_product_base<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0, 3>}’
   using Base::const_cast_derived;
               ^
/usr/include/eigen3/Eigen/src/Core/util/Macros.h:796:3: note: in expansion of macro ‘EIGEN_GENERIC_PUBLIC_INTERFACE’
   EIGEN_GENERIC_PUBLIC_INTERFACE(Derived) \
   ^
/usr/include/eigen3/Eigen/src/Core/Product.h:191:5: note: in expansion of macro ‘EIGEN_DENSE_PUBLIC_INTERFACE’
     EIGEN_DENSE_PUBLIC_INTERFACE(Derived)
     ^
/usr/include/eigen3/Eigen/src/Core/Product.h: In instantiation of ‘class Eigen::Product<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0>’:
/home/wy/workdir/slambook/ch3/useEigen/eigenMatrix.cpp:52:65:   required from here
/usr/include/eigen3/Eigen/src/Core/util/Macros.h:790:15: error: no members matching ‘Eigen::Product<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0>::Base {aka Eigen::internal::dense_product_base<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0, 3>}::derived’ in ‘Eigen::Product<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0>::Base {aka class Eigen::internal::dense_product_base<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0, 3>}’
   using Base::derived; \
               ^
/usr/include/eigen3/Eigen/src/Core/Product.h:122:5: note: in expansion of macro ‘EIGEN_GENERIC_PUBLIC_INTERFACE’
     EIGEN_GENERIC_PUBLIC_INTERFACE(Product)
     ^
/usr/include/eigen3/Eigen/src/Core/util/Macros.h:791:15: error: no members matching ‘Eigen::Product<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0>::Base {aka Eigen::internal::dense_product_base<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0, 3>}::const_cast_derived’ in ‘Eigen::Product<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0>::Base {aka class Eigen::internal::dense_product_base<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0, 3>}’
   using Base::const_cast_derived;
               ^
/usr/include/eigen3/Eigen/src/Core/Product.h:122:5: note: in expansion of macro ‘EIGEN_GENERIC_PUBLIC_INTERFACE’
     EIGEN_GENERIC_PUBLIC_INTERFACE(Product)
     ^
/home/wy/workdir/slambook/ch3/useEigen/eigenMatrix.cpp: In function ‘int main(int, char**)’:
/home/wy/workdir/slambook/ch3/useEigen/eigenMatrix.cpp:52:63: error: conversion fromconst Eigen::Product<Eigen::Matrix<float, 2, 3>, Eigen::Matrix<double, 3, 1>, 0>’ to non-scalar type ‘Eigen::Matrix<double, 2, 1>’ requested
     Eigen::Matrix<double, 2, 1> result_wrong_type = matrix_23 * v_3d;
                                                               ^
CMakeFiles/eigenMatrix.dir/build.make:62: recipe for target 'CMakeFiles/eigenMatrix.dir/eigenMatrix.cpp.o' failed
make[2]: *** [CMakeFiles/eigenMatrix.dir/eigenMatrix.cpp.o] Error 1
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/eigenMatrix.dir/all' failed
make[1]: *** [CMakeFiles/eigenMatrix.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2
*** Failure: Exit code 2 ***

我们应该显式转换,代码如下:

Eigen::Matrix<double, 2, 1> result = matrix_23.cast<double>() * v_3d;

2、在Eigen中,不能搞错矩阵的维度。(这是线性代数中矩阵相乘的基本前提要求)

Eigen::Matrix<double, 2, 3> result_wrong_dimension = matrix_23.cast<double>() * v_3d;

维度不对的时候,报错如下:

/home/wy/workdir/slambook/ch3/useEigen/build> make -j2
Scanning dependencies of target eigenMatrix
[ 50%] Building CXX object CMakeFiles/eigenMatrix.dir/eigenMatrix.cpp.o
In file included from /usr/include/eigen3/Eigen/Core:297:0,
                 from /home/wy/workdir/slambook/ch3/useEigen/eigenMatrix.cpp:5:
/usr/include/eigen3/Eigen/src/Core/AssignEvaluator.h: In instantiation of ‘void Eigen::internal::call_assignment_no_alias(Dst&, const Src&, const Func&) [with Dst = Eigen::Matrix<double, 2, 3, 0, 2, 3>; Src = Eigen::Product<Eigen::CwiseUnaryOp<Eigen::internal::scalar_cast_op<float, double>, const Eigen::Matrix<float, 2, 3> >, Eigen::Matrix<double, 3, 1>, 0>; Func = Eigen::internal::assign_op<double>]’:
/usr/include/eigen3/Eigen/src/Core/PlainObjectBase.h:700:41:   required from ‘Derived& Eigen::PlainObjectBase<Derived>::_set_noalias(const Eigen::DenseBase<OtherDerived>&) [with OtherDerived = Eigen::Product<Eigen::CwiseUnaryOp<Eigen::internal::scalar_cast_op<float, double>, const Eigen::Matrix<float, 2, 3> >, Eigen::Matrix<double, 3, 1>, 0>; Derived = Eigen::Matrix<double, 2, 3, 0, 2, 3>]’
/usr/include/eigen3/Eigen/src/Core/PlainObjectBase.h:510:19:   required from ‘Eigen::PlainObjectBase<Derived>::PlainObjectBase(const Eigen::DenseBase<OtherDerived>&) [with OtherDerived = Eigen::Product<Eigen::CwiseUnaryOp<Eigen::internal::scalar_cast_op<float, double>, const Eigen::Matrix<float, 2, 3> >, Eigen::Matrix<double, 3, 1>, 0>; Derived = Eigen::Matrix<double, 2, 3, 0, 2, 3>]’
/usr/include/eigen3/Eigen/src/Core/Matrix.h:379:29:   required from ‘Eigen::Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols>::Matrix(const Eigen::EigenBase<OtherDerived>&) [with OtherDerived = Eigen::Product<Eigen::CwiseUnaryOp<Eigen::internal::scalar_cast_op<float, double>, const Eigen::Matrix<float, 2, 3> >, Eigen::Matrix<double, 3, 1>, 0>; _Scalar = double; int _Rows = 2; int _Cols = 3; int _Options = 0; int _MaxRows = 2; int _MaxCols = 3]’
/home/wy/workdir/slambook/ch3/useEigen/eigenMatrix.cpp:62:86:   required from here
/usr/include/eigen3/Eigen/src/Core/util/StaticAssert.h:119:9: error: ‘YOU_MIXED_MATRICES_OF_DIFFERENT_SIZES’ is not a member of ‘Eigen::internal::static_assertion<false>if (Eigen::internal::static_assertion<static_cast<bool>(CONDITION)>::MSG) {}
         ^
/usr/include/eigen3/Eigen/src/Core/util/StaticAssert.h:184:3: note: in expansion of macro ‘EIGEN_STATIC_ASSERT’
   EIGEN_STATIC_ASSERT( \
   ^
/usr/include/eigen3/Eigen/src/Core/AssignEvaluator.h:744:3: note: in expansion of macro ‘EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE’
   EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE(ActualDstTypeCleaned,Src)
   ^
CMakeFiles/eigenMatrix.dir/build.make:62: recipe for target 'CMakeFiles/eigenMatrix.dir/eigenMatrix.cpp.o' failed
make[2]: *** [CMakeFiles/eigenMatrix.dir/eigenMatrix.cpp.o] Error 1
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/eigenMatrix.dir/all' failed
make[1]: *** [CMakeFiles/eigenMatrix.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2
*** Failure: Exit code 2 ***

四则运算:

matrix_33.transpose()    // 转置
 matrix_33.sum()   // 各元素和
matrix_33.trace()          //
10*matrix_33           // 数乘
matrix_33.inverse()       //
matrix_33.determinant()  // 行列式

求解方程:

    cout<<"我们求解 matrix_NN * x = v_Nd 这个方程"<<endl;
    // N的大小在前边的宏里定义(N=50),它由随机数生成
    // 直接求逆自然是最直接的,但是求逆运算量大 x = matrix_NN.inverse()*v_Nd;

    Eigen::Matrix< double, MATRIX_SIZE, MATRIX_SIZE > matrix_NN;
    matrix_NN = Eigen::MatrixXd::Random( MATRIX_SIZE, MATRIX_SIZE );
    Eigen::Matrix< double, MATRIX_SIZE,  1> v_Nd;
    v_Nd = Eigen::MatrixXd::Random( MATRIX_SIZE,1 );

    clock_t time_stt = clock(); // 计时
    // 直接求逆
    Eigen::Matrix<double,MATRIX_SIZE,1> x = matrix_NN.inverse()*v_Nd;
    cout <<"time use in normal inverse is " << 1000* (clock() - time_stt)/(double)CLOCKS_PER_SEC << "ms"<< endl;
    
    // 通常用矩阵分解来求,例如QR分解,速度会快很多
    time_stt = clock();
    x = matrix_NN.colPivHouseholderQr().solve(v_Nd);
    cout <<"time use in Qr decomposition is " <<1000*  (clock() - time_stt)/(double)CLOCKS_PER_SEC <<"ms" << endl;

运行如下:

我们求解 matrix_NN * x = v_Nd 这个方程
time use in normal inverse is 11.65ms
time use in Qr decomposition is 0.102ms

转载于:https://www.cnblogs.com/wongyi/p/8734346.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值