Eigen库的主要函数及用法

本文介绍了C++中用于矩阵计算的Eigen库。阐述了其模块和头文件,如Core模块等,还介绍了Matrix类、向量、Dynamic标识符及构造函数。说明了矩阵元素存储顺序,最后给出求解稀疏矩阵的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.Eigen简介

Eigen是C++中可以用来调用并进行矩阵计算的一个库,可以视为C++封装的MATLAB矩阵包或C++封装的numpy矩阵运算包 。

2.模块和头文件

Eigen库被分为一个Core模块和其他一些模块,每个模块有一些相应的头文件。 为了便于引用,Dense模块整合了一系列模块;Eigen模块整合了所有模块。一般情况下,include<Eigen/Dense>就够了。

2.1 Matrix类

在Eigen,所有的矩阵和向量都是Matrix模板类的对象,Vector 只是一种特殊的矩阵(一行或者一列)。

Matrix有6个模板参数,主要使用前三个参数,剩下的有默认值。

Matrix<typename Scalar, int RowsAtCompileTime, int ColsAtCompileTime>

Scalar是表示元素的类型,RowsAtCompileTime为矩阵的行,ColsAtCompileTime为矩阵的列。

库中提供了一些类型便于使用,如:

typedef Matrix<float, 5, 5> Matrix4f;

2.2 Vectors向量

列向量

typedef Matrix<float, 4, 1> Vector4f;

行向量

typedef Matrix<int, 1, 3> RowVector3i;

2.3 Dynamic

Eigen不只限于已知大小(编译阶段)的矩阵,有些矩阵的尺寸是运行时确定的,于是引入了一个特殊的标识符:Dynamic

typedef Matrix<double, Dynamic, Dynamic> MatrixXd;
typedef Matrix<int, Dynamic, 1> VectorXi;
Matrix<float, 3, Dynamic>

2.4 构造函数

默认的构造函数不执行任何空间分配,也不初始化矩阵的元素。

  Eigen头文件定义了许多类型,所有的类型都在Eigen的命名空间内。MatrixXd代表的是任意大小(X*X)的矩阵,并且每个元素为double类型。X 代表未知或不确定。

Matrix3f a;
MatrixXf b;

这里,a是一个3x3的矩阵,分配了float[9]的空间,但未初始化内部元素;b是一个动态大小的矩阵,定义是未分配空间(00)。

指定大小的矩阵,只是分配相应大小的空间,未初始化元素。

MatrixXf A(5,10);
VectorXf B(20);

这里,A 是一个5*10的动态大小的矩阵,分配了空间但未初始化元素;B是一个20大小的向量,同样分配空间未初始化元素。

为了对固定大小和动态大小的矩阵提供统一的API,对指定大小的Matrix传递sizes也是合法的(传递也被忽略)。

Matrix3f A(3,3);

可以用构造函数提供4以内( ≤4)尺寸的Vector的初始化。

Vector2d a(5.0, 6.0);
Vector3d b(5.0, 6.0, 7.0);
Vector4d c(5.0, 6.0, 7.0, 8.0);

对矩阵取元素取决于matrix的存储顺序,默认是按列存储的,也可以改为按行。

3.矩阵相关主要函数及用法

#include <iostream>
#include <Eigen/Dense>

using namespace Eigen;
using namespace std;

int main()
{
    VectorXd X1  = VectorXd::Zero(5);  // 长度为5的全0向量

    MatrixXd X2 = MatrixXd::Random(3,3);  // 3x3 的随机数矩阵

    MatrixXd X3 = MatrixXd::Constant(3,3,1.5)  // 3x3 的常量矩阵

    MatrixXd X4 = MatrixXd::Zero(4, 4); // 4x4 的全0矩阵

    MatrixXd X5 = MatrixXd::Ones(4, 4); // 4x4 的全1矩阵
    
    MatrixXd X6  =  X5.resize(2,8);  // 调整矩阵的行列

    MatrixXd H = MatrixXd::Identity(5, 5); // 5x5 的单位矩阵

    int r= H.rows();   //得到矩阵的行数

    int c = H.cols();  //得到矩阵的列数
    
    int s = H.size()   //得到矩阵元素总个数 5x5=25

    MatrixXd K = H.transpose();  // 矩阵求转置

    MatrixXd Rinv =  R.inverse();  // 矩阵求逆

    R(0, 2) = 2;  // 矩阵赋值, 第1行, 第 3 列

    R(1, 3) = 3; // 矩阵赋值, 第2行, 第 4 列

	// 矩阵复合运算 state predict
	// _Xpre = _A * _Xupd  + _B * _U;

	// 矩阵复合运算 State Covariance Prediction
	// _Ppre = _A * _Pupd * _A.transpose() + _Q;
    // MatrixXd K = _Ppre * H.transpose() * ((H * _Ppre * H.transpose() + _R).inverse());
}

求解稀疏矩阵的示例

#include <iostream>
#include <vector>
#include "eigen3/Eigen/Sparse"

int main() {
    // int a = 5;
    // std::cout << "a is: " << a <<  std::endl;
    std::vector<Eigen::Triplet<double>> triplet;

    triplet.emplace_back(0, 0, 10);
    triplet.emplace_back(2, 0, 11);

    Eigen::SparseMatrix<double> A(3, 3);

    A.setFromTriplets(triplet.begin(), triplet.end());

    std::cout << A.innerIndexPtr()[0] << std::endl; // prints 0
    std::cout << A.innerIndexPtr()[1] << std::endl; // prints 2
    std::cout << std::endl;
    std::cout << A.outerIndexPtr()[0] << std::endl; // prints 0
    std::cout << A.outerIndexPtr()[1] << std::endl; // prints 2, but I thought it should print 0
    std::cout << std::endl;
    std::cout << A.valuePtr()[0] << std::endl; // print
    std::cout << A.valuePtr()[1] << std::endl; // print
    
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

scott198512

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值