eigen库的矩阵操作(Eigen/Dense类)

本文详细介绍了Eigen库中矩阵的基本操作,包括矩阵的声明、赋值、运算、矩阵的逆、特征值分解等。并对比了直接求逆和矩阵分解在解决线性方程组时的效率。
// 来自高翔SLAM十四讲
#include<iostream>
#include<ctime>
#include<eigen3/Eigen/Core>
// 稠密矩阵的代数运算(逆、特征值等)
#include<eigen3/Eigen/Dense>

using namespace std;

#define MATRIX_SIZE 5

int main(){
	// eigen以矩阵为基本数据元素。它是一个模板类。它的前三个参数为:数据类型,行,列
	// 声明一个2*3的float矩阵
	Eigen::Matrix<float,2,3> matrix23;
	// 同时,eigen通过typedef提供了许多内置类型,不过底层仍旧是eigen::Matrix
	// 例如:Vector3d实质上是Eigen::Matrix<double,3,1>
	Eigen::Vector3d v_3d;
	// Matrix3d实质上是Eigen::Matrix<double,3,3>
	Eigen::Matrix3d matrix33 = Eigen::Matrix3d::Zero();	// 初始化为0
	// 如果大小不确定的矩阵,可以使用动态大小的矩阵
	Eigen::Matrix<double, Eigen::Dynamic, -1> matrix_dynamic;
	// 更简单的
	Eigen::MatrixXd matrix_x;
	// 还有很多类似的类型,自己看吧

	// 下面是对矩阵的操作
	// 输入数据
	matrix23 << 1,2,3,4,5,6;	// 重载了 <<
	// 输出
	cout<<matrix23<<endl;

	// 用()访问矩阵中的元素
	for(int i=0; i<1; i++){
		for(int j=0; j<2; j++){
			cout<<matrix23(i,j)<<endl;
		}
	}

	v_3d << 3,
### Eigen Dense 矩阵定义 在 C++ 的 Eigen 中,`Dense` 矩阵表示密集型矩阵结构。这种型的矩阵存储方式是连续的内存布局,适用于大多数常见的线性代数计算场景。通过 `Eigen/Dense` 头文件引入的功能可以用于处理向量、固定大小和动态大小的矩阵以及各种基本操作。 #### 密集矩阵的核心概念 `Eigen/Dense` 提供了一组来实现密集矩阵操作。其中最常用的之一是 `Matrix` 模板[^1]。该模板允许用户指定数据型、行列维度以及其他选项。以下是其通用形式: ```cpp template<typename _Scalar, int _Rows, int _Cols, int _Options=AutoAlign|ColMajor> class Matrix; ``` - `_Scalar`: 表示矩阵元素的数据型(如 float 或 double)。 - `_Rows`: 指定矩阵的行数;如果设为 `Dynamic` 则表示运行时决定。 - `_Cols`: 指定列的数量;同样可静态设定或者标记为动态尺寸。 - `_Options`: 可选参数,默认情况下采用列优先 (Column-Major) 存储顺序并自动对齐以优化性能。 #### 使用实例 下面展示如何利用 `Eigen/Dense` 来定义不同种矩阵,并执行简单的初始化过程。 ```cpp #include <iostream> #include <Eigen/Dense> using namespace std; int main(){ // 动态分配二维数组作为一般用途的双精度浮点数矩阵 Eigen::MatrixXd m(2, 3); // 初始化所有元素值均为零 m.setZero(); cout << "A 2x3 matrix of doubles:\n" << m << endl; // 静态大小整数方阵声明与单位化赋值 Eigen::Matrix<int, 3, 3> iMat; iMat.setIdentity(); cout << "\nAn integer identity matrix size 3x3:\n" << iMat << endl; return 0; } ``` 上述代码片段展示了两种不同的矩阵创建方式:一种是具有两行三列的动态矩阵,另一种则是固定的 $3 \times 3$ 整数身份矩阵[^2]。 #### 特殊功能 - 单位矩阵生成 对于需要频繁构建单位矩阵的应用场合,可以直接调用成员函数 `.setIdentity()` 方法完成快速填充工作而无需手动逐项设置。 --- ### 总结 综上所述,在 C++ 中借助于强大的第三方 —— **Eigen**, 开发者能够轻松高效地管理复杂的数学模型中的各矩阵实体及其变换逻辑。无论是基础层面还是高级特性方面都提供了详尽的支持方案[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值