Eigen库使用简介

C++线性代数库Eigen简明教程 线性代数在3D游戏建模、深度学习、机器人工程、视频图像处理、航空航天等领域都有着举足轻重的位置。在使用C++编程时,如果从零编写矩阵的乘法、求逆、求特征值等运算,将会是件很麻烦的事情。而且,不管是从计算正确性,还是从效率方面都很难得到保障。因此,成熟稳定的线性代数库显得尤为重要。 Eigen是线性代数的C++模板库,它包含矩阵、向量、四元数、数值求解器和相关算法,其拥有良好的稳定性和计算效率,是我们搭建C++工程研究算法的必备利器。 阅读详情

Eigen是开源的C++线性代数库,常用在计算机图形学中。
有份英文的Eigen使用手册,简要整理一下

安装
$ cd ~
$ git clone https://github.com/eigenteam/eigen-git-mirror

Eigen所有的文件都是h文件,只需include即可使用,
但是要告诉编译器它在哪个位置。

$ sudo ln -s /usr/local/include ~/eigen-git-mirror/Eigen
使用
#include <Eigen/Core>

创建新矩阵的时候如下

Matrix3f A;
Matrix4d B;

这里的命名有一个便利性,比如A的类型是Matrix3f,就表示A是3x3 float型矩阵,
同理B是4x4 double型矩阵。
但并不是所有组合都work的,比如Matrix5s就会报错(虽然想的是5x5 short);也不是必须是正方形的矩阵。
那如果想用5x5 short的maxtrix呢?或者是长和宽不同的矩阵呢?

Matrix<short, 5, 5> M1;
Matrix<float, 20, 75> M2;

另外,Eigen还支持在编译的时候还不知道长和宽的矩阵,用X代替,如MatrixXf, MatrixXd。

矩阵的初始化
// Initialize A
A << 1.0 f , 0.0 f , 0.0 f ,
	0.0 f , 1.0 f , 0.0 f ,
	0.0 f , 0.0 f , 1.0 f ;
	
// Initialize B by accessing individual elements
for i = 1:4 {
	for j = 1:4 {
		B (j , i ) = 0.0;
	}
}

上面第一种方式,会一行一行地向矩阵中填入数字,所有的数字都必须提供,
如果size不match的话会报错。

第二种方式,B矩阵,可以看到是一列一列填数字的,当然也可以换成一行一行填,不过Eigen的储存方式是列主导的,一列一列填效率会更高。

指定某元素的时候不像C++那样用方括号,A[i. j], 而是圆括号A(i, j)。

也有便利的方式初始化数值

// Set each coefficient to a uniform random value in the range
[ -1 , 1]
A = Matrix3f :: Random () ;

// Set B to the identity matrix
B = Matrix4d :: Identity () ;

// Set all elements to zero
A = Matrix3f :: Zero () ;

// Set all elements to ones
A = Matrix3f :: Ones () ;

// Set all elements to a constant value
B = Matrix4d :: Constant (4.5) ;
矩阵运算

常用的矩阵运算来一波

Matrix4f M1 = Matrix4f :: Random () ;
Matrix4f M2 = Matrix4f :: Constant (2.2) ;

// Addition
// The size and the coefficient - types of the matrices must match
cout << M1 + M2 << endl ;

// Matrix multiplication
// The inner dimensions and the coefficient - types must match
cout << M1 * M2 << endl ;

// Scalar multiplication , and subtraction
// What do you expect the output to be ?
cout << M2 - Matrix4f :: Ones () * 2.2 << endl ;

等号(==)和不等号(!=)也可用在矩阵的比较上,所有对应数字都相等矩阵才相等。

cout << ( M2 - Matrix4f :: Ones () * 2.2 == Matrix4f :: Zero () )
<< endl 

矩阵的转置和逆运算

// Transposition
cout << M1 . transpose () << endl ;

// Inversion ( # include < Eigen / Dense > )
// Generates NaNs if the matrix is not invertible
cout << M1 . inverse () << endl ;

如果想进行矩阵的element-wise计算,可以把矩阵当作array来计算,通过调用array()方法

// Square each element of the matrix
cout << M1 . array () . square () << endl ;

// Multiply two matrices element - wise
cout << M1 . array () * Matrix4f :: Identity () . array () << endl ;

// All relational operators can be applied element - wise
cout << M1 . array () <= M2 . array () << endl << endl ;
cout << M1 . array () > M2 . array () << endl ;

注意上面的方法不是in place的,就是说不是在原矩阵上运算的,它会返回一个新的矩阵,比如
M1.array().sqrt()运算后会返回一个新矩阵,而M1数值不变。

Vector和矩阵用法类似,参考Eigen使用手册

平移和旋转
# include < Eigen / Core >
# include < Eigen / Geometry >
# include < iostream >
using namespace std ;
using namespace Eigen ;
int main () {
	float arrVertices [] = { -1.0 , -1.0 , -1.0 ,
							1.0 , -1.0 , -1.0 ,
							1.0 , 1.0 , -1.0 ,
							-1.0 , 1.0 , -1.0 ,
							-1.0 , -1.0 , 1.0 ,
							1.0 , -1.0 , 1.0 ,
							1.0 , 1.0 , 1.0 ,
							-1.0 , 1.0 , 1.0};
	MatrixXf mVertices = Map < Matrix < float , 3 , 8 > > ( arrVertices ) ;
	Transform < float , 3 , Affine > t = Transform < float , 3 , Affine >::
				Identity () ;
	t . scale ( 0.8 f ) ;
	t . rotate ( AngleAxisf (0.25 f * M_PI , Vector3f :: UnitX () ) ) ;
	t . translate ( Vector3f (1.5 , 10.2 , -5.1) ) ;
	cout << t * mVertices . colwise () . homogeneous () << endl ;
}

上面用C++数组初始化一个MatrixXf型的矩阵,包含了x,y,z坐标。通过Eigen的Map类来初始化矩阵。
t进行了scale, 旋转和平移变换。用矩阵表示的话,变换如下
U = TRSI,其中I表示单位矩阵。

rotation包含了旋转角度和旋转轴,旋转轴必须是归一化的单位向量;可以用AngleAxisf类把旋转角和旋转轴组合到一起。
Vector3f::UnitX(), Vector3f::UnitY, Vector3f::UnitZ() 分别表示x, y, z方向的单位向量。

更多的使用方法请参考

从“0”到“1”:Eigen库全面指南 在 C++ 编程的广阔天地中,线性代数运算占据着举足轻重的地位,而 Eigen 库就如同一位得力助手,为开发者们提供了强大而高效的线性代数计算支持。Eigen 库是一个基于 C++ 的开源模板库,专注于线性代数领域,涵盖了矩阵运算、向量操作、数值求解以及相关算法等丰富功能。从性能表现来看,Eigen 库堪称卓越。 阅读详情

相关推荐

Eigen——c++矩阵库使用入门实践

简介 一句话介绍Eigen: Eigen is a C++ template library for linear algebra: matrices, vectors, numerical solvers, and related algorithms. Eigen是用于线性代数的C++模板库:用于矩阵,向量,数值求解器和相关算法运算。 特点: 功能完善:支持所有大小的矩阵、支持所有标准数据类型等 速度极快:表达式模板允许在适当的情况下智能地删除临时文件并启用延迟计算 高可靠性 高灵活性 机器学

guotianqing的博客 6528

Eigen库完全教程——从入门到入魂

eigen库是C++中的线性代数库,实现了线性代数以及矩阵分析中所有计算方法。既然已经要学eigen库了,想必,线性代数的基本知识肯定是有的。如果你是做三维重建的,那么这个库必学。

qq_45545158的博客 1万+

Eigen基本操作总结

Eigen

yohnyang的博客 844

Eigen 库入门教程

其中需要注意的是 MatrixXf::Zero(m, n) 以及 MatrixXf::Identity(m, n),分别代表全0矩阵和对角线为1的矩阵。Eigen库对于很多需要做SLAM、图像、自动驾驶等方向的人肯定不陌生非常值得学习,本文将整理一些Eigen库的使用教程供初学者能够快速熟悉并入门。Eigen库最显著的特点是,使用时只需要包含头文件即可(它是纯用头文件搭建起来的库),不需要链接库。那么上面写的 Dense是最常用的,我们包含的时候如何选择呢?表征,对于一维和二维的数组,则由模板。

m0_46611008的博客 4001

Eigen-3.3.4官方源码镜像 eigen-git-mirror

Eigen官方网站在github上发布的Eigen-3.3.4源码镜像,可以上Eigen官方github(https://github.com/eigenteam/eigen-git-mirror)进行下载, 如果github无法下载,可以在这里下载,与官方完全一样

window部署open claw(使用wsl-Ubuntu-docker部署)

本文详细介绍了在Windows 11系统下通过WSL2+Docker部署OpenClaw的完整流程。首先需要满足硬件配置要求并开启虚拟化功能,然后依次完成WSL2安装配置、Docker Desktop安装、OpenClaw镜像拉取等步骤。重点说明了端口映射、socat转发配置及openclaw.json文件修改方法。最后通过验证WSL2内网IP和端口访问服务。该方案具有最佳兼容性,能有效避免Windows环境下的依赖冲突问题。

Kmoyic的博客 2763

矩阵中QR算法分解简介和基于Eigen库使用示例

A∈Rn×nA∈Rn×n(一般为实对称矩阵)AAA的特征值和特征向量AkQkRkAk​Qk​Rk​Ak1RkQkAk1​Rk​Qk​重复这个过程,多次迭代后AkA\_kAk收敛为一个上三角矩阵,其对角元素即为特征值。

qq_36812406的博客 1552

手机OIS马达拆解:从苹果的悬丝到三星的滚珠,不同方案如何影响你的拍照体验?

本文深度解析手机OIS马达技术,对比苹果悬丝式、三星滚珠式和LG记忆合金式三种主流方案的机械原理与成像体验差异。通过详实的数据和测试结果,揭示不同OIS技术如何影响防抖性能、模组厚度及长期可靠性,为摄影爱好者和技术爱好者提供实用选购建议。

weixin_42554408的博客 303

目标跟踪:Eigen 库简介

Eigen 是一个高效、灵活的 C++ 模板库,专注于线性代数运算,包括矩阵和向量的基本操作、数值解法、特征值计算、矩阵分解Eigen 是纯粹的模板库(不需要额外的编译), 只包含头文件,不依赖任何外部库,可移植性强,支持多种编译器和平台Eigen 具有非常高的性能,尤其在处理数值计算密集型的任务时能够充分利用 CPU 的 SIMD(单指令多数据)指令集(如等)来加速运算支持动态矩阵和静态矩阵,矩阵大小可在编译时确定,减小开销,语法直观, 接近数学表达。支持各种矩阵运算和数值分析算法支持。

Man 753

5G NR PDCCH实战解析:从DCI格式到CORESET配置的完整指南

本文深入解析5G NR PDCCH的实战配置,涵盖DCI格式选择、CORESET配置及Search Space优化等关键内容。基于3GPP R16标准,提供现网部署中的典型问题解决方案,如覆盖边缘失步、多用户调度冲突等,帮助提升控制信令传输效率。特别针对5G NR PDCCH的灵活资源分配和自适应编码机制进行详细探讨。

weixin_29231263的博客 496

基于 STM32 的手持式安检金属探测器设计与实现

【代码】基于 STM32 的手持式安检金属探测器设计与实现。

weixin_42300449的博客 899

c++矩阵运算库Eigen简介

C++矩阵运算库Eigen介绍 C++中的矩阵运算库常用的有Armadillo,Eigen,OpenCV,ViennaCL,PETSc等。我自己在网上搜了一下不同运算库的特点,最后选择了Eigen。主要原因是Eigen体积较小,不用安装也不用编译,库是以头文件的形式给出,直接将它扔到我们自己的工程文件中即可,移植起来也无压力。我们可以在Eigen官网下载源文件。 Eigen的HelloWorld ...

weixin_33701251的博客 807

组合导航 | RTK、IMU与激光雷达组合导航算法:原理、实现与验证

当激光雷达噪声增加至0.1m时,系统位置RMSE仅上升18%,验证了滤波算法的鲁棒性[110]:融合方案在RTK信号丢失30秒后,位置误差仍控制在1.5m内,显著优于IMU单独导航[28]:ESKF框架能有效建模传感器误差特性,状态向量需包含外参与时间偏移等关键参数。:传感器标定精度直接影响系统性能,建议每3个月进行一次重新标定。:IMU预积分与特征匹配是系统实时性的关键瓶颈,需重点优化。:维持10秒窗口内的关键帧,平衡精度与实时性[132]:特征匹配占总耗时的65%,可通过。

尘世冰封的专栏 942

Eigen与Matlab函数对应

// A simple quickref for Eigen.

TiH2S 1682

单板电源设计(LDO、DC/DC)

高速电路设计的电源架构 在电路设计中,一块单板往往涉及多种电源,常见的如5V/3.3V/2.5V/1.8V/1.5V/1.2V/1V0.9V/0.75V等,如此多种类的电源不可能都直接通过背板从电源板获得。一般,单板仅有一种或者两种输入电源,如48V或12V,再由它们产生单板上器件所需要的电源。 单板如何由输入电源生成所需电源,常见有两种架构:集中式电源架构和分布式电源架构。 ...

sinat_15677011的博客 8326

c++ pcl点云处理(2025 长期更新)

目录1.常用的点云文件2.认识点云的文件格式3.点云的数据结构4.输入输出(IO)5.KD树6.Oc树(八叉树)7.点云可视化8.点云滤波9.点云拟合分割10.点云与图像11.特征点与特征描述及提取12.点云配准13.点云曲面重建

twnkie的博客 2257

Eigen库安装及使用教程

eigen c++库安装及使用教程。

tutu_hu的博客 8667

Unity3D实现自定义河流路径或泥石流路径

此工具是一个插件,插件很好用,可以根据地形编辑河流的走向以及宽度,也可以发挥想象编辑成其他的效果,比如泥石流效果,岩浆效果,小溪,或者大江或者大河等等博客将会介绍可以编辑河流的工具的使用。希望这篇博客对Unity的开发者有所帮助。大家好,我是心疼你的一切,不定时更新Unity开发技巧,觉得有用记得一键三连哦。提示:以下是本篇文章正文内容,下面案例可供参考本次总结的就是工具的使用, 有需要会继续增加功能不定时更新Unity开发技巧,觉得有用记得一键三连哦。么么哒!

心疼你的一切博客 5264

eigen库安装_快速入门矩阵运算——开源库Eigen

矩阵是数学中一个重要的工具,广泛应用于各种场景下的数值分析,例如,数字信号处理,图像处理等。我们如何在程序中使用矩阵进行运算呢?本文将为大家介绍一个开源的矩阵运算工具——Eigen。Eigen is a C++ template library for linear algebra: matrices, vectors, numerical solvers, and related algorit...

weixin_39521808的博客 2127

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Eigen介绍及简单使用

Eigen是可以用来进行线性代数、矩阵、向量操作等运算的C++库,它里面包含了很多算法。它的License是MPL2。它支持多平台。 Eigen采用源码的方式提供给用户使用,在使用时只需要包含Eigen的头文件即可进行使用。之所以采用这种方式,是因为Eigen采用模板方式实现,由于模板函数不支持分离编译,所以只能提供源码而不是动态库的方式供用户使用。 矩阵的定义:E...

yxpandjay的博客 11万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

cmake使用eigen库

Eigen是一个C++开源线性代数库:提供矩阵的线性代数运算。 注:Eigen是一个只有头文件的库 cmake使用eigen库 find_package(Eigen3) INCLUDE_DIRECTORIES(${EIGEN3_INCLUDE_DIR}) 程序中使用eigen库,引用各功能头文件 #include&lt;Eigen/core&gt;...

加油鸭 1万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Eigen库使用

前言Eigen是一个高层次的C ++库,有效支持 得到的线性代数,矩阵和矢量运算,数值分析及其相关的算法。配置关于Eigen库的配置只需要在属性表包含目录中添加Eigen路径即可。 例子Example 1:#include <iostream> #include <Eigen/Dense>void main() { Eigen::MatrixXd m(2, 2); /

wokaowokaowokao12345的专栏 1万+

Eigen 库介绍,Ubuntu22 下安装 Eigen

Eigen 是一个高级的 C++ 库,用于线性代数、矩阵和向量运算、数值解决以及其他数学计算。它被设计为高效、易用,并且能够与 C++ 的特性无缝集成。Eigen库广泛应用于科学计算、工程、机器学习和计算机图形学等领域。

coco的专栏 1481

Eigen库快速入门

Eigen库的简单介绍 Eigen库是基于C++模板的线性代数库,适用于处理矩阵的运算。Eigen适用范围广,支持包括固定大小、任意大小的所有矩阵操作,甚至是稀疏矩阵;支持所有标准的数值类型,并且可以扩展为自定义的数值类型;支持多种矩阵分解及其几何特征的求解;它不支持的模块生态系统提供了许多专门的功能,如非线性优化,矩阵功能,多项式解算器,快速傅立叶变换等。 Eigen支持多种编译环境,在Ubu...

qq_43872529的博客 1012
上一篇: 超详解transformer(附图)
下一篇: leetcode 1305. All Elements in Two Binary Search Trees(两个BST的元素升序排列)
蓝羽飞鸟
博客等级 码龄8年 1万+粉丝 727原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

蓝羽飞鸟

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

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

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

打赏作者

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

抵扣说明:

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

余额充值