当前位置: 首页 > news >正文

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&#xff0c;除了C标准库以外&#xff0c;不需要任何其他的依赖包。Eigen使用的CMake建立配置文件和单元测试&#xff0c;并自动安装。如果使用Eigen库&#xff0c;只需包特定模块的的头文件即可。 基本功能 Eigen适用范…...

【spring 】Spring Cloud Gateway 的Filter学习

介绍和使用场景 Spring Cloud Gateway 是一个基于 Spring Framework 5 和 Project Reactor 的 API 网关&#xff0c;它旨在为微服务架构提供一种简单而有效的方式来处理请求路由、过滤、限流等功能。在 Spring Cloud Gateway 中&#xff0c;Filter 扮演着非常重要的角色&#…...

每秒交易数(Transactions Per Second:TPS)详细拆解

每秒交易数&#xff08;TPS&#xff09;是指计算机网络每秒可以处理的交易数量。TPS是衡量不同区块链和其他计算机系统速度的关键指标。然而&#xff0c;TPS并不是用来衡量区块链速度的唯一指标。许多人认为&#xff0c;虽然TPS很重要&#xff0c;但最终性实际上是一个更重要的…...

【初阶数据结构与算法】链表刷题之链表分割、相交链表、环形链表1、环形链表I、环形链表II

文章目录 一、链表分割二、相交链表三、环形链表I四、环形链表|| 一、链表分割 题目链接&#xff1a;https://www.nowcoder.com/practice/0e27e0b064de4eacac178676ef9c9d70 我们来看看链表分割的题目描述和它给出的函数&#xff1a;    这个题虽然是以C形式来做&#xff0…...

【STL】set,multiset,map,multimap的介绍以及使用

关联式容器 在C的STL中包含序列式容器和关联式容器 1.关联式容器&#xff1a;它里面存储的是元素本身&#xff0c;其底层是线性序列的数据结构&#xff0c;比如&#xff1a;vector&#xff0c;list&#xff0c;deque&#xff0c;forward_list(C11)等 2.关联式容器里面储存的…...

新能源二手车交易量有望破百万,二手车市场回暖了吗?

这些年&#xff0c;伴随着新能源汽车市场的高速发展&#xff0c;各种新能源车的二手车也在逐渐增加&#xff0c;不过之前的二手车市场相对比较冷清&#xff0c;就在最近一则新闻传出新能源二手车交易量有望破百万&#xff0c;二手车市场这是回暖了吗&#xff1f; 一、新能源二手…...

哈佛商业评论 | 项目经济的到来:组织变革与管理革新的关键

在21世纪,项目经济(Project Economy)逐步取代传统运营,成为全球经济增长的核心动力。项目已不再是辅助工具,而是推动创新和变革的重要载体。然而,只有35%的项目能够成功,显示出项目管理领域存在巨大的改进空间。本文将详细探讨项目经济的背景、项目管理的挑战,以及适应…...

web浏览器环境下使用window.open()打开PDF文件不是预览,而是下载文件?

如果你使用 window.open() 方法打开 PDF 文件&#xff0c;但浏览器不是预览而是下载文件&#xff0c;这可能是由于以下几个原因&#xff1a; 服务器配置&#xff1a;服务器可能将 PDF 文件配置为下载而不是预览。例如&#xff0c;服务器可能设置了 Content-Disposition 响应头…...

【GeekBand】C++设计模式笔记12_Singleton_单件模式

1. “对象性能” 模式 面向对象很好地解决了 “抽象” 的问题&#xff0c; 但是必不可免地要付出一定的代价。对于通常情况来讲&#xff0c;面向对象的成本大都可以忽略不计。但是某些情况&#xff0c;面向对象所带来的成本必须谨慎处理。典型模式 SingletonFlyweight 2. Si…...

Pyhon基础数据结构(列表)【蓝桥杯】

a [1,2,3,4,5] a.reverse() print("a ",a) a.reverse() print("a ",a)# 列表 列表&#xff08;list&#xff09;有由一系列按照特定顺序排序的元素组成 列表是有顺序的&#xff0c;访问任何元素需要通过“下标访问” 所谓“下标”就是指元素在列表从左…...

Linux篇(权限管理命令)

目录 一、权限概述 1. 什么是权限 2. 为什么要设置权限 3. Linux中的权限类别 4. Linux中文件所有者 4.1. 所有者分类 4.2. 所有者的表示方法 属主权限 属组权限 其他权限 root用户&#xff08;超级管理员&#xff09; 二、普通权限管理 1. ls查看文件权限 2. 文件…...

深入理解 Spark 中的 Shuffle

Spark 的介绍与搭建&#xff1a;从理论到实践_spark环境搭建-CSDN博客 Spark 的Standalone集群环境安装与测试-CSDN博客 PySpark 本地开发环境搭建与实践-CSDN博客 Spark 程序开发与提交&#xff1a;本地与集群模式全解析-CSDN博客 Spark on YARN&#xff1a;Spark集群模式…...

leetcode-8-字符串转整数

题解: 代码:...

SQL注入注入方式(大纲)

SQL注入注入方式&#xff08;大纲&#xff09; 常规注入 通常没有任何过滤&#xff0c;直接把参数存放到SQL语句中。 宽字节注入 GBK 编码 两个字节表示一个字符ASCII 编码 一个字节表示一个字符MYSQL默认字节集是GBK等宽字节字符集 原理&#xff1a; 设置MySQL时错误配置…...

OpenCV基础(1)

1.图像读写与窗口显示 1.1.imread读取图像文件 Mat cv::imread(const string &filename,int flags IMREAD_COLOR); filename&#xff1a;要读取的图像文件名flags&#xff1a;读取模式&#xff0c;可以从枚举cv::ImreadModes中取值&#xff0c;默认取值是IMREAD_COLOR&am…...

【freertos】FreeRTOS信号量的介绍及使用

FreeRTOS信号量 一、概述二、PV原语三、函数接口1.创建一个计数信号量2.删除一个信号量3.信号量释放4.在中断释放信号量5.获取一个信号量&#xff0c;可以是二值信号量、计数信号量、互斥量。6.在中断获取一个信号量&#xff0c;可以是二值信号量、计数信号量7.创建一个二值信号…...

React Native 全栈开发实战班 - 图片加载与优化

在移动应用中&#xff0c;图片加载与优化 是提升用户体验和减少资源消耗的重要环节。图片加载不当可能导致应用卡顿、内存泄漏甚至崩溃。本章节将介绍 React Native 中常用的图片加载方法&#xff0c;包括 Image 组件的使用、第三方图片加载库&#xff08;如 react-native-fast…...

Golang云原生项目:—实现ping操作

熟悉报文结构 ICMP校验和算法&#xff1a; 报文内容&#xff0c;相邻两个字节拼接到一起组成一个16bit数&#xff0c;将这些数累加求和若长度为奇数&#xff0c;则将剩余一个字节&#xff0c;也累加求和得出总和之后&#xff0c;将和值的高16位与低16位不断求和&#xff0c;直…...

mysql如何查看当前事务的事务id

-- 开启一个事务&#xff0c;但不执行写操作 START TRANSACTION; -- 查询 InnoDB 事务信息 SELECT * FROM information_schema.innodb_trx;在 MySQL 的 MVCC (多版本并发控制) 中&#xff0c;事务 ID (Transaction ID) 是由 InnoDB 存储引擎分配的&#xff0c;它的分配机制与事…...

在linux里如何利用vim对比两个文档不同的行数

在Linux中&#xff0c;可以使用vimdiff命令来对比两个文档中不同的行。首先确保你的系统中安装了vim编辑器。 打开终端&#xff0c;使用以下命令来启动vimdiff&#xff1a; vimdiff file1 file2 这里file1和file2是你想要对比的两个文件的路径。 vimdiff会以并排方式打开两…...

深入解析Python中的逻辑回归:从入门到精通

引言 在数据科学领域&#xff0c;逻辑回归&#xff08;Logistic Regression&#xff09;是一个非常重要的算法&#xff0c;它不仅用于二分类问题&#xff0c;还可以通过一些技巧扩展到多分类问题。逻辑回归因其简单、高效且易于解释的特点&#xff0c;在金融、医疗、广告等多个…...

【数据库】mysql数据库迁移前应如何备份数据?

MySQL 数据库的备份是确保数据安全的重要措施之一。在进行数据库迁移之前&#xff0c;备份现有数据可以防止数据丢失或损坏。以下是一套详细的 MySQL 数据库备份步骤&#xff0c;适用于大多数情况。请注意&#xff0c;具体的命令和工具可能因 MySQL 版本的不同而有所差异。整个…...

C语言——鸡兔同笼问题

没注释的源代码 #include <stdio.h> #include <stdlib.h> /* run this program using the console pauser or add your own getch, system("pause") or input loop */ int main(int argc, char *argv[]) { int tou 10; i…...

数据结构王道P234第二题

#include<iostream> using namespace std; int visit[MAxsize]; int color[MaxSize];//1表示红&#xff0c;2表示白&#xff1b; bool dfs(Graph G, int i){visit[i]1;ArcNode *p;bool flag1;for(pG.vertices[i].firsrarc; p ; pp->next){int jp->adjvex;if(!visi…...

层归一化和批归一化

层归一化是针对某一样本的所有特征&#xff0c;批归一化是针对所有样本的某一特征。 计算公式&#xff1a;&#xff08;当前值 - 均值&#xff09;/ 标准差。 作用&#xff1a;缓解梯度消失和梯度爆炸的问题&#xff0c;并提高网络的泛化性能。 为什么Transform和BERT中使用层归…...

Spring Cloud Gateway 网关

微服务网关 Spring Cloud Gateway https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gateway-request-predicates-factories Spring Cloud 在版本 2020.0.0 开始&#xff0c;去除了 Zuul 网关的使用&#xff0c;改用 Spring Cloud Gateway 作为网关…...

LabVIEW中的UDP与TCP比较

在LabVIEW中&#xff0c;UDP和TCP可以用于不同的网络通信场景&#xff0c;开发者可以根据需求选择合适的协议。以下是结合LabVIEW开发时的一些比较和应用场景&#xff1a; 1.TCP在LabVIEW中的应用&#xff1a; 可靠性高的场景&#xff1a;当开发一个对数据传输的准确性和完整…...

半导体器件与物理篇3 P-N结

热平衡时的PN结 pn结的定义&#xff1a;由p型半导体和n型半导体接触形成的结 pn结的特性和关键变量包括&#xff1a;整流性&#xff08;即电流单向导通的特性&#xff09;、平衡费米能级&#xff08;费米能级 E F E_F EF​为常数, d E F d x 0 &#xff09;、内建电势 \frac…...

深入剖析String类的底层实现原理

嘿嘿,家人们,今天咱们来模拟实现string,好啦,废话不多讲,开干! 1:string.h 1.1:构造函数与拷贝构造函数 1.1.1:写法一 1.1.2:写法二(给缺省值) 1.2:赋值运算符重载与operatror[]获取元素 1.3:容量与迭代器 1.4:reserve与resize 1.5:清空与判断是否为空 1.6:push_back与…...

#其它:面试题

第一面试官提问如下&#xff1a; 1、自我介绍 2、根据项目提问&#xff1a;混合开发调取api的通讯方式 3、技术提问&#xff1a;如何隐藏div&#xff0c;但是div需要存在 使用 visibility 隐藏&#xff1a; 1.visibility: hidden2.display: none 3.opcity: 04、css塌陷问题…...