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

发布于:2025-05-01 ⋅ 阅读:(41) ⋅ 点赞:(0)

1. Matrix 类(稠密矩阵)

模板参数

cpp

Matrix<Scalar, Rows, Cols, Options, MaxRows, MaxCols>
  • Scalar: 元素类型(如 floatdoubleint)。

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

  • Options: 存储顺序(RowMajor 或 ColMajor,默认 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)。

  • 常用别名:

    • Vector2fVector3d: 固定大小向量。

    • 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();  // 正确

网站公告

今日签到

点亮在社区的每一天
去签到