Eigen核心矩阵/向量类 (Matrix, Vector, Array)

1. Matrix 类(稠密矩阵)

模板参数

cpp

复制代码
Matrix<Scalar, Rows, Cols, Options, MaxRows, MaxCols>
  • Scalar : 元素类型(如 float, double, int)。

  • Rows/Cols : 行数和列数(Dynamic 表示动态大小)。

  • Options : 存储顺序(RowMajorColMajor,默认 ColMajor)。

  • MaxRows/MaxCols: 动态矩阵的最大尺寸(可选)。

常用属性
属性 说明 示例
RowsAtCompileTime 编译时行数(Dynamic 为 -1) Matrix3f::RowsAtCompileTime == 3
ColsAtCompileTime 编译时列数 MatrixXd::ColsAtCompileTime == Dynamic
SizeAtCompileTime 元素总数(行×列) Vector4d::SizeAtCompileTime == 4
核心方法
方法 参数说明 返回值/功能 示例
rows(), cols(), size() 返回当前行数、列数、元素总数 A.rows()
operator()(i,j) i: 行索引,j: 列索引 访问或修改元素 A(1,2) = 5;
setZero() 将矩阵置零 A.setZero();
setIdentity() 设置为单位矩阵 B.setIdentity();
transpose() 返回转置矩阵(视图) MatrixXd C = A.transpose();
sum(), mean() 所有元素的和/平均值 double s = A.sum();
col(j), row(i) j: 列索引,i: 行索引 返回列/行向量(视图) Vector3d v = A.col(0);
resize(rows, cols) 动态矩阵调整大小 无(修改自身) A.resize(5, 5);

2. Vector 类(列向量)

说明
  • 本质是 Matrix<Scalar, Size, 1> 的别名(列数为 1)。

  • 常用别名:

    • Vector2f, Vector3d: 固定大小向量。

    • VectorXf: 动态大小向量(X 表示动态)。

特有方法
方法 参数说明 功能 示例
dot(v) v: 同类型向量 点积 double d = v1.dot(v2);
cross(v) v: 3D 向量 叉积(仅 3D 向量) Vector3f v3 = v1.cross(v2);
normalize() 向量归一化(修改自身) v.normalize();
norm() 返回向量的 L2 范数 double len = v.norm();

3. Array 类(逐元素操作)

说明
  • Matrix 类似,但用于逐元素运算(如 +, *, sin())。

  • 模板参数同 Matrix,常用别名:

    • Array33f: 3x3 浮点数组。

    • ArrayXXd: 动态大小数组。

特有方法
方法 参数说明 功能 示例
cwiseProduct(arr) arr: 同类型数组 逐元素乘法 C = A.cwiseProduct(B);
cwiseQuotient(arr) arr: 同类型数组 逐元素除法 D = A.cwiseQuotient(B);
abs(), sqrt() 逐元素绝对值/平方根 B = A.abs();
exp(), log() 逐元素指数/对数 C = A.exp();

4. 初始化方式

方法 示例 说明
逗号初始化 Matrix3f A; A << 1,2,3, 4,5,6, 7,8,9; 按行填充元素
构造函数 Vector4d b(1.0, 2.0, 3.0, 4.0); 直接初始化
特殊矩阵 MatrixXd::Random(3,3); 随机矩阵
Matrix3d::Identity(); 单位矩阵

5. 代码示例

cpp

复制代码
#include <Eigen/Dense>
using namespace Eigen;

// 初始化矩阵和向量
Matrix3d A;
A << 1, 2, 3, 
     4, 5, 6, 
     7, 8, 9;
Vector3d b(1, 2, 3);

// 矩阵运算
Matrix3d B = A.transpose();
double dot_product = b.dot(Vector3d::Ones());
ArrayXXd C = A.array().sqrt();  // 逐元素平方根

// 解线性方程组
Vector3d x = A.colPivHouseholderQr().solve(b);

关键区别

特性 Matrix Array
用途 线性代数运算(矩阵乘法) 逐元素运算(数学函数)
运算符 * 矩阵乘法 逐元素乘法

通过 array()matrix() 方法可互相转换:

cpp

复制代码
MatrixXd M = A.array() * B.array();  // 错误!需显式转换
MatrixXd M = (A.array() * B.array()).matrix();  // 正确
相关推荐
byxdaz3 天前
Eigen矩阵操作类 (Map, Block, 视图类)
eigen
黄卷青灯777 个月前
c++ vector类 和 eigen库 处理向量的区别 列出代码举例
开发语言·c++·vector·eigen
风与铃的约定9 个月前
2.2 视觉SLAM 实践:Eigen
c++·机器人·slam·视觉slam·eigen·机器人运动学
西西弗Sisyphus9 个月前
softmax 函数的多种实现方式 包括纯C语言、C++版本、Eigen版本等
c语言·c++·softmax·eigen
点云兔子10 个月前
Eigen::Isometry3d 的定义和用途
3d·eigen·isometry3d
西西弗Sisyphus10 个月前
Eigen中 Row-Major 和 Column-Major 存储顺序的区别
开发语言·python·eigen·跟踪
大米粥哥哥1 年前
Qt 配置Eigen矩阵库 - 并简单测试
开发语言·qt·矩阵·eigen·fft·低通滤波
小林up1 年前
Eigen笔记2:矩阵拼接
线性代数·eigen
太阳风暴1 年前
Eigen-矩阵和向量运算
c++·线性代数·矩阵·eigen·矩阵向量运算·矩阵和向量运算