Ubuntu下的Eigen库的安装及基本使用教程
一、Eigen库介绍
简介
Eigen [1]目前最新的版本是3.4,除了C++标准库以外,不需要任何其他的依赖包。Eigen使用的CMake建立配置文件和单元测试,并自动安装。如果使用Eigen库,只需包特定模块的的头文件即可。
基本功能
Eigen适用范围广,支持包括固定大小、任意大小的所有矩阵操作,甚至是稀疏矩阵;支持所有标准的数值类型,并且可以扩展为自定义的数值类型;支持多种矩阵分解及其几何特征的求解;它不支持的模块生态系统 [2]提供了许多专门的功能,如非线性优化,矩阵功能,多项式解算器,快速傅立叶变换等。
Eigen支持多种编译环境,开发人员对库中的实例在多种编译环境下经过测试,以保证其在不同编译环境下的可靠性和实用性。
介绍来之百度百科,点这里
二、Eigen库的下载及安装
进入官方下载路径,点这里

下载eigen-3.4.0.tar.gz到本地,解压
tar -xzf eigen-3.4.0.tar.gz
编译项目
# 进入eigen源码目录
cd eigen-3.4.0
# 创建文件夹build-编译用
mkdir build
# 进入build
cd build
# 开始构建
cmake ..
安装项目
# 执行安装 - 注意这里不需要make,原因前面解释过eigen是模式式编程
# 不需要真正的编译,只需要把头文件安装到系统include目录即可
make install
上面命令执行后,默认安装 Eigen采用源码的方式提供给用户使用,在使用时只需要包含Eigen的头文件即可进行使用。之所以采用这种方式,是因为Eigen采用模板方式实现,由于模板函数不支持分离编译,所以只能提供源码而不是动态库的方式供用户使用。到/usr/local/include/目录
三、Eigen基本使用
引入Eigen库
#include <iostream>
#include <Eigen/Core>
#include <Eigen/Dense>
1、定义矩阵、基本访问、为矩阵赋值、重置矩阵
// 1. 定义矩阵
Eigen::MatrixXd m(2,2);
Eigen::Vector3d vec3d;
Eigen::Vector4d vec4d(1.0, 2.0, 3.0, 4.0);// Matrix创建的矩阵默认是按列存储,Eigen在处理按列存储的矩阵时会更加高效,可通过如下方法修改优先存储方式
Matrix<int,3, 4, ColMajor> Acolmajor;
Matrix<int,3, 4, RowMajor> Arowmajor;// 2. 定义动态矩阵、静态矩阵
Eigen::MatrixXd matrixXd; // 动态矩阵,通过mat.resise()重新修改矩阵大小
Eigen::Matrix3d matrix3d;// 3. 矩阵元素的访问
m(0, 0) = 1;
m(0, 1) = 2;
m(1, 0) = m(0, 0) + 3;
m(1, 1) = m(0, 0) * m(0, 1);
cout << m << endl << endl;// 4. 设置矩阵的元素
m << -5.5, 3.1,5.9, 1.0;
cout << m << endl << endl;
int row = 4;
int col = 5;
Eigen::MatrixXf matrixXf(row, col);
matrixXf << 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20;
cout << matrixXf << endl << endl;// 5. 重置矩阵
Eigen::MatrixXd matrixXd1(4,4);
cout << "原m的行列为:" << m.rows() << " , " << m.cols() << endl << endl;
m.resize(5,100); // 通过resize修改矩阵大小
cout << "新1的m行列为:" << m.rows() << " , " << m.cols() << endl << endl;
m = matrixXd1; // 通过直接赋值新矩阵,修改矩阵大小
cout << "新2的m行列为:" << m.rows() << " , " << m.cols() << endl << endl;
2、常用矩阵、及常用的基本矩阵运算
常用特殊矩阵:0矩阵、1矩阵、单位矩阵、随机矩阵
常用的矩阵运算:转置、共轭、共轭转置、求逆、求迹、求行列式、求模、求和、求均值、求乘积、求最小、求最大
点乘、叉乘
// 1. 其他常用特殊的矩阵
Eigen::Matrix3d m3;
m3 = Eigen::Matrix3d::Zero();
cout << "Zero() : " << endl << m3 << endl << endl;m3 = Eigen::Matrix3d::Identity();
cout << "Identity() : " << endl << m3 << endl << endl;m3 = Eigen::Matrix3d::Random();
cout << "Random() : " << endl << m3 << endl << endl;// 2. 直接设置为常用特殊矩阵
m3.setRandom(); // 随机矩阵
m3.setOnes(); // 全1矩阵
m3.setZero(); // 全0矩阵
m3.setIdentity(); // 单位矩阵// 3. 矩阵的运算1
Eigen::Matrix3d new_m3;
new_m3 = m3.transpose();
cout << "============================================" << endl << endl;
cout << "m3.transpose() - 转置: " << endl << new_m3 << endl << endl;new_m3 = m3.conjugate();
cout << "m3.conjugate() - 共轭: " << endl << new_m3 << endl << endl;new_m3 = m3.adjoint();
cout << "m3.adjoint() - 伴随矩阵(共轭转置): " << endl << new_m3 << endl << endl;
// 对于实数矩阵,conjugate不执行任何操作,adjoint等价于transposecout << "m3.inverse() - 求逆: " << endl << m3.inverse(); << endl << endl;
cout << "m3.trace() - 求迹: " << endl << m3.trace() << endl << endl;
cout << "m3.determinant() - 求行列式: " << endl << m3.determinant() << endl << endl;
cout << "m3.norm() - 求模: " << endl << m3.norm() << endl << endl;
cout << "m3.sum() - 求和: " << endl << m3.sum() << endl << endl;
cout << "m3.mean() - 求均值: " << endl << m3.mean() << endl << endl;
cout << "m3.prod() - 求乘积: " << endl << m3.prod() << endl << endl;
cout << "m3.minCoeff() - 求最小: " << endl << m3.minCoeff() << endl << endl;
cout << "m3.maxCoeff() - 求最大: " << endl << m3.maxCoeff() << endl << endl;// 3. 矩阵的运算2
Eigen::Vector3d v1(1, 2, 3);
Eigen::Vector3d v2(2, 1, 2);// 点乘
double a;
a = v1.dot(v2);
cout << "v1.dot(v2) - 点乘: " << endl << a << endl << endl;// 叉乘
cout << "v1.cross(v2) - 叉乘: " << endl << v1.cross(v2) << endl << endl;
四、Eigen的应用
1、求矩阵的特征值及特征向量
// 求解特征值及特征向量
Eigen::Matrix2f matrix2f;
matrix2f << 1, 2, 3, 4;
Eigen::SelfAdjointEigenSolver<Eigen::Matrix2f> eigenSolver(matrix2f);
cout<< "SelfAdjointEigenSolver: " << eigenSolver.info() << endl;
if (eigenSolver.info() == Eigen::Success ) {cout << eigenSolver.eigenvalues() << endl << endl;cout << eigenSolver.eigenvectors() << endl << endl;
}
2、求解线性方程组Ax=b
方法一:直接法求线性方程组(求逆法)
const int n = 4;
Eigen::Matrix<double, n, n > A;
A = A.Random() * 10;
Eigen::Matrix<double, n, 1> b;
b = b.Random() * 10;// 定义未知x
Eigen::Matrix<double, n, 1> x;
x = A.inverse() * b; // 直接取逆 (这种效率很低,不推荐使用)
cout << "A=" << endl << A << endl << "b=" << b << endl << endl;
cout << "x=" << x << endl << endl;
注意上面例子,直接求逆法是低效的,一般情况不推荐选择求逆法,且直接对A.inverse(),可能会取逆失败,无法完成A.inverse()*b的运算操作
方法二:QR分解法(推荐)
// const int n = 4;
// Eigen::Matrix<double, n, n > A;
// A = A.Random() * 10;
// Eigen::Matrix<double, n, 1> b;
// b = b.Random() * 10;// case-1:使用前面的A、b矩阵,定义未知x2
Eigen::Matrix<double, n, 1> x2;
x2 = A.colPivHouseholderQr().solve(b);
cout << "QR分解法" <<endl;
cout << "x=" << x2 << endl << endl;// case-2:当然有时为了使用QR分解对象,也可以用下面方法计算,
Eigen::ColPivHouseholderQR<Eigen::MatrixXd> qrDec(A);
x = qrDec.solve(b);// case-3 或者采用分离式分布构造
Eigen::ColPivHouseholderQR<Eigen::MatrixXd> qrDec2; // 只声明,不待入参,并不立即构造分解
qrDec2.compute(A); // 执行计算进行分解
x = qrDec2.solve(b); // 求解
上面三种使用方法,任取一种即可
3、如何评估或计算解的精度
// 继续前面的计算,我们可以采用下面的方式计算精度
double relative_error = (A*x - b).norm() / b.norm();
std::cout << "The relative error is:\n" << relative_error << std::endl;
4、求矩阵的秩
计算秩,通常是使用各类分解算法提供的rank()方法计算,Eigen中的许多分解算法,都提供了rank()求秩
Eigen::MatrixXd A(3,3);
A << 1, 2, 5,2, 1, 4,3, 0, 3;
cout << "A=" << endl << A << endl << endl;
Eigen::ColPivHouseholderQR<Eigen::MatrixXd> qrDec;
// 分解
qrDec.compute(A);
// 计算秩
cout<< "A rank = " << endl << qrDec.rank() << endl << endl;
任何算法的秩的计算根据设置的阈值来进行的,也就是设置不同的阈值,对结果将造成影响;Eigen中秩的计算依赖于分解方法的阈值,并不是矩阵对角大小乘以机器的精度epsilon,可通过调用
dec.setThreshold(th_val)设置;且注意,分解算法并不会依赖阈值的设定,也就是执行完成分解后,任可以任意设置阈值,并求解rank()得到正确的秩;
Eigen库提供了多种求解线性方程组的算法,如下所示

参考地址,点这里
在实际问题处理中,如何选择不同的方法,对求解效率将会较大的影响,可根据系数矩阵A的特征,选择不同的分解算法:
- 如果系数矩阵是对于非对称、满秩的,则最适合的分解求解方法是PartialPivLU.
- 如果系数矩阵是对称正定的,则最适合的分解方法是 LLT 或LDLT
各类算法的求解效率对比可参考如下:

参考地址,点这里
相关文章:
Ubuntu下的Eigen库的安装及基本使用教程
一、Eigen库介绍 简介 Eigen [1]目前最新的版本是3.4,除了C标准库以外,不需要任何其他的依赖包。Eigen使用的CMake建立配置文件和单元测试,并自动安装。如果使用Eigen库,只需包特定模块的的头文件即可。 基本功能 Eigen适用范…...
【spring 】Spring Cloud Gateway 的Filter学习
介绍和使用场景 Spring Cloud Gateway 是一个基于 Spring Framework 5 和 Project Reactor 的 API 网关,它旨在为微服务架构提供一种简单而有效的方式来处理请求路由、过滤、限流等功能。在 Spring Cloud Gateway 中,Filter 扮演着非常重要的角色&#…...
每秒交易数(Transactions Per Second:TPS)详细拆解
每秒交易数(TPS)是指计算机网络每秒可以处理的交易数量。TPS是衡量不同区块链和其他计算机系统速度的关键指标。然而,TPS并不是用来衡量区块链速度的唯一指标。许多人认为,虽然TPS很重要,但最终性实际上是一个更重要的…...
【初阶数据结构与算法】链表刷题之链表分割、相交链表、环形链表1、环形链表I、环形链表II
文章目录 一、链表分割二、相交链表三、环形链表I四、环形链表|| 一、链表分割 题目链接:https://www.nowcoder.com/practice/0e27e0b064de4eacac178676ef9c9d70 我们来看看链表分割的题目描述和它给出的函数: 这个题虽然是以C形式来做࿰…...
【STL】set,multiset,map,multimap的介绍以及使用
关联式容器 在C的STL中包含序列式容器和关联式容器 1.关联式容器:它里面存储的是元素本身,其底层是线性序列的数据结构,比如:vector,list,deque,forward_list(C11)等 2.关联式容器里面储存的…...
新能源二手车交易量有望破百万,二手车市场回暖了吗?
这些年,伴随着新能源汽车市场的高速发展,各种新能源车的二手车也在逐渐增加,不过之前的二手车市场相对比较冷清,就在最近一则新闻传出新能源二手车交易量有望破百万,二手车市场这是回暖了吗? 一、新能源二手…...
哈佛商业评论 | 项目经济的到来:组织变革与管理革新的关键
在21世纪,项目经济(Project Economy)逐步取代传统运营,成为全球经济增长的核心动力。项目已不再是辅助工具,而是推动创新和变革的重要载体。然而,只有35%的项目能够成功,显示出项目管理领域存在巨大的改进空间。本文将详细探讨项目经济的背景、项目管理的挑战,以及适应…...
web浏览器环境下使用window.open()打开PDF文件不是预览,而是下载文件?
如果你使用 window.open() 方法打开 PDF 文件,但浏览器不是预览而是下载文件,这可能是由于以下几个原因: 服务器配置:服务器可能将 PDF 文件配置为下载而不是预览。例如,服务器可能设置了 Content-Disposition 响应头…...
【GeekBand】C++设计模式笔记12_Singleton_单件模式
1. “对象性能” 模式 面向对象很好地解决了 “抽象” 的问题, 但是必不可免地要付出一定的代价。对于通常情况来讲,面向对象的成本大都可以忽略不计。但是某些情况,面向对象所带来的成本必须谨慎处理。典型模式 SingletonFlyweight 2. Si…...
Pyhon基础数据结构(列表)【蓝桥杯】
a [1,2,3,4,5] a.reverse() print("a ",a) a.reverse() print("a ",a)# 列表 列表(list)有由一系列按照特定顺序排序的元素组成 列表是有顺序的,访问任何元素需要通过“下标访问” 所谓“下标”就是指元素在列表从左…...
Linux篇(权限管理命令)
目录 一、权限概述 1. 什么是权限 2. 为什么要设置权限 3. Linux中的权限类别 4. Linux中文件所有者 4.1. 所有者分类 4.2. 所有者的表示方法 属主权限 属组权限 其他权限 root用户(超级管理员) 二、普通权限管理 1. ls查看文件权限 2. 文件…...
深入理解 Spark 中的 Shuffle
Spark 的介绍与搭建:从理论到实践_spark环境搭建-CSDN博客 Spark 的Standalone集群环境安装与测试-CSDN博客 PySpark 本地开发环境搭建与实践-CSDN博客 Spark 程序开发与提交:本地与集群模式全解析-CSDN博客 Spark on YARN:Spark集群模式…...
leetcode-8-字符串转整数
题解: 代码:...
SQL注入注入方式(大纲)
SQL注入注入方式(大纲) 常规注入 通常没有任何过滤,直接把参数存放到SQL语句中。 宽字节注入 GBK 编码 两个字节表示一个字符ASCII 编码 一个字节表示一个字符MYSQL默认字节集是GBK等宽字节字符集 原理: 设置MySQL时错误配置…...
OpenCV基础(1)
1.图像读写与窗口显示 1.1.imread读取图像文件 Mat cv::imread(const string &filename,int flags IMREAD_COLOR); filename:要读取的图像文件名flags:读取模式,可以从枚举cv::ImreadModes中取值,默认取值是IMREAD_COLOR&am…...
【freertos】FreeRTOS信号量的介绍及使用
FreeRTOS信号量 一、概述二、PV原语三、函数接口1.创建一个计数信号量2.删除一个信号量3.信号量释放4.在中断释放信号量5.获取一个信号量,可以是二值信号量、计数信号量、互斥量。6.在中断获取一个信号量,可以是二值信号量、计数信号量7.创建一个二值信号…...
React Native 全栈开发实战班 - 图片加载与优化
在移动应用中,图片加载与优化 是提升用户体验和减少资源消耗的重要环节。图片加载不当可能导致应用卡顿、内存泄漏甚至崩溃。本章节将介绍 React Native 中常用的图片加载方法,包括 Image 组件的使用、第三方图片加载库(如 react-native-fast…...
Golang云原生项目:—实现ping操作
熟悉报文结构 ICMP校验和算法: 报文内容,相邻两个字节拼接到一起组成一个16bit数,将这些数累加求和若长度为奇数,则将剩余一个字节,也累加求和得出总和之后,将和值的高16位与低16位不断求和,直…...
mysql如何查看当前事务的事务id
-- 开启一个事务,但不执行写操作 START TRANSACTION; -- 查询 InnoDB 事务信息 SELECT * FROM information_schema.innodb_trx;在 MySQL 的 MVCC (多版本并发控制) 中,事务 ID (Transaction ID) 是由 InnoDB 存储引擎分配的,它的分配机制与事…...
在linux里如何利用vim对比两个文档不同的行数
在Linux中,可以使用vimdiff命令来对比两个文档中不同的行。首先确保你的系统中安装了vim编辑器。 打开终端,使用以下命令来启动vimdiff: vimdiff file1 file2 这里file1和file2是你想要对比的两个文件的路径。 vimdiff会以并排方式打开两…...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...
自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...
Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合
作者:来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布,Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明,Elastic 作为 …...
从物理机到云原生:全面解析计算虚拟化技术的演进与应用
前言:我的虚拟化技术探索之旅 我最早接触"虚拟机"的概念是从Java开始的——JVM(Java Virtual Machine)让"一次编写,到处运行"成为可能。这个软件层面的虚拟化让我着迷,但直到后来接触VMware和Doc…...
恶补电源:1.电桥
一、元器件的选择 搜索并选择电桥,再multisim中选择FWB,就有各种型号的电桥: 电桥是用来干嘛的呢? 它是一个由四个二极管搭成的“桥梁”形状的电路,用来把交流电(AC)变成直流电(DC)。…...
