Eigen的使用总结

简介: Eigen的使用总结

Eigen 是一个 C++ 开源线性代数库

它提供了快速的有关矩阵的线性代数运算,还包括解方程等功能。

Eigen 它是一个纯用头文件搭建起来的库,只能找到它的头文件,没有.so 或.a 那样的二进制文件

在使用时,只需引入 Eigen 的头文件即可,不需要链接它的库文件

下面总结下 其 使用 方法 ,方便忘记时翻阅

声明矩阵和向量

Eigen 以矩阵为基本数据单元。它是一个模板类。它的前三个参数为:数据类型,行,列

=============================================

声明一个基本的矩阵

声明一个 2*3 的 float 矩阵

//声明一个 2*3 的 float 矩阵
Eigen::Matrix<float, 2, 3> matrix_23;

=============================================

声明一个基本的向量

同时,Eigen 通过 typedef 提供了许多内置类型,不过底层仍是 Eigen::Matrix
Vector3d 实质上是 Eigen::Matrix<double, 3, 1>

//声明一个 三维向量 
Eigen::Vector3d v_3d;

=============================================

矩阵初始化为零

还有 Matrix3d 实质上是 Eigen::Matrix<double, 3, 3>

Eigen::Matrix3d matrix_33 = Eigen::Matrix3d::Zero(); //初始化为零

=============================================

矩阵赋值随机数

matrix_33 = Eigen::Matrix3d::Random();//矩阵取随机数

在这里插入图片描述

=============================================

声明动态大小的矩阵

如果不确定矩阵大小,可以使用动态大小的矩阵

Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic > matrix_dynamic;
Eigen::MatrixXd matrix_x;//相当于上面一行

=============================================

对矩阵操作

输入数据

matrix_23 << 1, 2, 3, 4, 5, 6;//矩阵输入
v_3d << 3, 2, 1;//向量输入

=============================================

输出数据

cout << matrix_23 << endl;

打印的结果
在这里插入图片描述

=============================================

访问矩阵中的元素

通过()访问矩阵中的元素

for (int i=0; i<1; i++)
    for (int j=0; j<2; j++)
        cout<<matrix_23(i,j)<<endl;

在这里插入图片描述

=============================================

改变矩阵数据类型

matrix_23.cast< double >() 将 float 转换成了 double

matrix_23.cast<double>()

=============================================

矩阵相乘

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

注意 两矩阵的类型要一致 ,矩阵的维度有匹配 ,否则会报错
matrix_23.cast< double >() 将 float 转换成了 double
在这里插入图片描述

 Eigen::Matrix<double, 2, 1> result_wrong_type = matrix_23 * v_3d;  // 这样不对  类型不匹配

报错如下:

error: no type named ‘ReturnType’ in ‘struct Eigen::ScalarBinaryOpTraits<float, double, Eigen::internal::scalar_product_op<float, double> >’
typedef typename ScalarBinaryOpTraits::Scalar, typename traits::Scalar>::ReturnType Scalar;
在这里插入图片描述
 Eigen::Matrix<double, 2, 3> result_wrong_dimension = matrix_23.cast<double>() * v_3d;// 这样不对  维度不匹配

报错如下

/usr/local/include/eigen3/Eigen/src/Core/PlainObjectBase.h:732:41: required from ‘Derived& Eigen::PlainObjectBase::_set_noalias(const Eigen::DenseBase&) [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/local/include/eigen3/Eigen/src/Core/PlainObjectBase.h:537:19: required from ‘Eigen::PlainObjectBase::PlainObjectBase(const Eigen::DenseBase&) [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/local/include/eigen3/Eigen/src/Core/Matrix.h:377:29: required from ‘Eigen::Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols>::Matrix(const Eigen::EigenBase&) [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/jone/slam_learn/eigneMatrix_lianxi/eigenMatrix.cpp:68:84: required from here
/usr/local/include/eigen3/Eigen/src/Core/util/StaticAssert.h:33:40: error: static assertion failed: YOU_MIXED_MATRICES_OF_DIFFERENT_SIZES
 #define EIGEN_STATIC_ASSERT(X,MSG) static_assert(X,#MSG);

在这里插入图片描述

矩阵转置

转置

matrix_33.transpose()

在这里插入图片描述

=============================================

各元素和

各元素和

matrix_33.sum()

在这里插入图片描述

=============================================

matrix_33.trace()

在这里插入图片描述

数乘

数乘

10*matrix_33

在这里插入图片描述

matrix_33.inverse()

在这里插入图片描述

=============================================

行列式

行列式

 matrix_33.determinant()

在这里插入图片描述

=============================================

求特征值

求特征值
对角化 A(T)*A
Eigen::SelfAdjointEigenSolver<Eigen::Matrix3d> eigen_solver ( matrix_33.transpose()*matrix_33 );
cout << "Eigen values = " << eigen_solver.eigenvalues() << endl;
cout << "Eigen vectors = " << eigen_solver.eigenvectors() << endl;
在这里插入图片描述

===============================================

利用矩阵解方程

直接求逆解方程

求解方程

求解 matrix_NN * x = v_Nd 这个方程
直接求逆自然是最直接的,但是求逆运算量大

#define MATRIX_SIZE 50

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 );

// 直接求逆
Eigen::Matrix<double,MATRIX_SIZE,1> x = matrix_NN.inverse()*v_Nd;

在这里插入图片描述

矩阵分解(QR) 解方程

// 通常用矩阵分解来求,例如 QR 分解,速度会快很多
x = matrix_NN.colPivHouseholderQr().solve(v_Nd);

在这里插入图片描述

相关文章
|
存储 编译器
[Eigen中文文档] 深入了解 Eigen - 类层次结构
本页面介绍了Eigen类层次结构中 Core 类的设计及其相互关系。一般用户可能不需要关注这些细节,但对于高级用户和Eigen开发人员可能会有用。
304 0
|
存储 C语言 C++
|
存储 编译器
|
存储 缓存
[Eigen中文文档] 深入了解 Eigen - 惰性求值与混叠(Aliasing)
Eigen具有智能的编译时机制,可以实现惰性求值并在适当的情况下删除临时变量。它会自动处理大多数情况下的混叠问题,例如矩阵乘积。自动行为可以通过使用MatrixBase::eval()和MatrixBase::noalias()方法手动覆盖。
314 0
|
存储 算法 NoSQL
[Eigen中文文档] 稀疏矩阵操作
在许多应用中(例如,有限元方法),通常要处理非常大的矩阵,其中只有少数系数不为零。在这种情况下,可以通过使用仅存储非零系数的特殊表示来减少内存消耗并提高性能。这样的矩阵称为稀疏矩阵。
488 0
[Eigen中文文档] 在 CMake 项目中使用 Eigen
Eigen提供了CMake(CMake 3.0或更高版本)支持,使得该库可以轻松地在CMake项目中使用。
735 1
|
存储 NoSQL API
[Eigen中文文档] Matrix类
在Eigen中,所有矩阵和向量都是Matrix模板类的对象。向量只是行数或者列数为1的特殊矩阵。
418 1
|
存储 索引
[Eigen中文文档] 扩展/自定义Eigen(三)
本页面针对非常高级的用户,他们不害怕处理一些Eigen的内部细节。在大多数情况下,可以通过使用自定义一元或二元函数避免使用自定义表达式,而极其复杂的矩阵操作可以通过零元函数(nullary-expressions)来实现,如前一页所述。 本页面通过示例介绍了如何在Eigen中实现新的轻量级表达式类型。它由三个部分组成:表达式类型本身、包含有关表达式编译时信息的特性类和评估器类,用于将表达式评估为矩阵。
147 1
|
存储 编译器 调度
|
并行计算 算法 安全
[Eigen中文文档] Eigen 和多线程
某些 Eigen 算法可以利用硬件中存在的多个内核。
460 0