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

Eigen矩阵操作类 (Map, Block, 视图类)

1. Map 类:内存映射(零拷贝操作)

核心功能

将现有的 C/C++ 数组或缓冲区映射为 Eigen 矩阵/向量,不复制数据,直接操作原内存。

模板参数

cpp

Map<Matrix<Scalar, Rows, Cols, Options, MaxRows, MaxCols>>
  • 参数与 Matrix 一致,通常简化为 Map<MatrixXd>(动态大小)或 Map<Vector3f>(固定大小)。

构造函数与方法
方法/构造函数参数说明功能示例
Map(Scalar* data)data: 原始数组指针映射为一维向量float arr[3]; Map<Vector3f> v(arr);
Map(Scalar* data, Index rows, Index cols)data: 数组指针,rows/cols: 矩阵尺寸映射为矩阵double buf[4]; Map<Matrix2d> m(buf, 2, 2);
data()返回原始指针float* ptr = v.data();
注意事项
  • 内存对齐:若原始数据未对齐(如动态分配的数组),需使用 Eigen::Unaligned 标志:

    cpp

    Map<Matrix3f, Unaligned> m(ptr);

2. Block 类:子矩阵操作

核心功能

提取矩阵的某一块区域(子矩阵),返回一个视图(不复制数据)。

主要方法
方法参数说明返回值/功能示例
block(Index startRow, Index startCol, Index blockRows, Index blockCols)startRow/startCol: 起始位置,blockRows/blockCols: 子块大小动态大小子块MatrixXd B = A.block(1, 1, 2, 2);
block<BlockRows, BlockCols>(startRow, startCol)模板参数:子块固定大小,startRow/startCol: 起始位置固定大小子块(编译时优化)auto C = A.block<2,2>(0, 0);
topLeftCorner(rows, cols)提取左上角子块同 blockMatrix3f D = A.topLeftCorner(3, 3);
middleRows(startRow, numRows)提取中间连续多行行子矩阵VectorXd seg = v.middleRows(2, 3);
变体方法
  • 列/行操作
    col(j).segment(start, length)(列向量的子段)、row(i).head(n)(行的前 n 元素)。

3. 视图类(TransposeDiagonal 等)

核心功能

通过视图(View)操作原矩阵的特定结构(如转置、对角元素),不复制数据

常用视图类
类/方法参数说明功能示例
transpose()返回转置视图MatrixXd AT = A.transpose();(注意:赋值会触发复制)
adjoint()返回共轭转置视图MatrixXcf AH = A.adjoint();
diagonal()可指定偏移量(默认 0)返回对角线的向量视图VectorXd diag = A.diagonal();
diagonal<Offset>()Offset: 对角线的偏移(正数=上对角线,负数=下对角线)返回指定对角线的视图VectorXd sup_diag = A.diagonal<1>();
triangularView<Mode>()ModeUpperLowerStrictlyUpper 等返回三角矩阵视图auto L = A.triangularView<Lower>();
视图的赋值与计算
  • 视图可直接参与运算,但若需保存结果,需赋值给具体矩阵:

    cpp

    MatrixXd B = A.transpose() * A;  // 合法:触发实际计算
    auto C = A.transpose();          // C 仍是视图,依赖 A 的生命周期!

4. 代码示例

cpp

#include <Eigen/Dense>
using namespace Eigen;// Map 示例
float data[] = {1, 2, 3, 4};
Map<Matrix<float, 2, 2, RowMajor>> mat_map(data);  // 按行映射
mat_map(1, 1) = 5;  // 修改原数组 data[3] = 5// Block 示例
MatrixXd A(4, 4);
A.setRandom();
MatrixXd B = A.block(1, 1, 2, 2);  // 提取 2x2 子矩阵
A.topLeftCorner(2, 2).setZero();   // 将左上角置零// 视图示例
Vector3d v(1, 2, 3);
MatrixXd M = v * v.transpose();     // 外积(v.transpose() 是视图)
double d = v.dot(v);                // 点积

5. 关键注意事项

  1. 生命周期管理:视图类(如 BlockTranspose)依赖原矩阵的数据,原矩阵销毁后视图无效。

  2. 性能优化:固定尺寸的 Block(如 block<2,2>())比动态尺寸更快。

  3. 别名问题:操作视图时避免与原矩阵混用,可能导致错误:

    cpp

    A = A.transpose();  // 错误!需使用 A.transposeInPlace();

完整方法速查表

操作类型类/方法典型用途
内存映射Map<MatrixXd>包装现有数组为 Eigen 矩阵
子块提取block()segment()操作局部数据
结构视图diagonal()transpose()快速访问对角线、转置等结构
http://www.xdnf.cn/news/166897.html

相关文章:

  • 【JavaScript】逻辑运算符--非布尔值的与或运算、赋值运算符
  • 4月26日随笔
  • springboot应用使用shell脚本打包成部署压缩包(支持xjar)
  • AI心理健康服务平台项目面试实战
  • 使用Xshell中自带的传输新建文件功能实现上传下载文件
  • 树相关处理
  • UniApp 的现状与 WASM 支持的迫切性
  • w308汽车销售系统的设计与实现
  • 腾讯CSIG一面
  • 05--Altium Designer(AD)的详细安装
  • SM30 权限检查
  • 高中数学联赛模拟试题精选第18套几何题
  • GPU加速-系统CUDA12.5-Windows10
  • cron定时任务
  • Linux | Mfgtools 修改单独只烧写 Uboot,内核,文件系统
  • 前端面试宝典---vue实现简化版
  • PCL点云处理之基于SAC-IA和ICP的点云配准完整流程(二百四十七)
  • 2025.04.26-美团春招笔试题-第一题
  • java中的Selector详解
  • Qt开发:QSettings的介绍和使用
  • JDK环境变量
  • 备忘录模式 (Memento Pattern)
  • Java 自定义TCP协议:【特点编码字符串<=>字节<=>特点编码16进制】16进制字符串和编码的转换 (各种编码通过字节向16进制的互转)| XOR计算
  • dubbo 异步化实践
  • 【MFA】✈️集成谷歌TOTP实现MFA多因素认证
  • 数组的多种声明方式:类型标注与泛型数组
  • 做大模型应用所需的一点点基础数学理论
  • 扩展和自定义 asammdf 库:满足特定需求的解决方案
  • 文章记单词 | 第46篇(六级)
  • 深度学习中的预训练与微调:从基础概念到实战应用全解析