C++ Eigen常见的高级用法 [学习笔记]

news2024/12/25 12:58:33

Eigen 是一个功能强大的线性代数库,提供了丰富的高级用法和操作工具,涵盖矩阵运算、向量操作、分解方法、几何变换等多个领域。以下是常用的高级用法总结,分门别类以便查阅。


1. 矩阵与向量操作

1.1 矩阵的基本操作

Eigen::MatrixXd matA(3, 3);
matA.setIdentity();          // 设置为单位矩阵
matA.setZero();              // 设置为零矩阵
matA.setOnes();              // 设置为全1矩阵
matA.transpose();            // 转置
matA.adjoint();              // 共轭转置
matA.inverse();              // 逆矩阵
matA.determinant();          // 行列式

1.2 块操作

Eigen::MatrixXd matB(4, 4);
matB.block(1, 1, 2, 2) = Eigen::MatrixXd::Identity(2, 2); // 提取或赋值子矩阵
matB.topLeftCorner(2, 2);    // 提取左上角块
matB.bottomRightCorner(2, 2);// 提取右下角块
matB.row(0) = Eigen::RowVector4d(1, 2, 3, 4); // 操作特定行
matB.col(1) = Eigen::Vector4d(5, 6, 7, 8);    // 操作特定列

1.3 对角线与三角操作

matA.diagonal() = Eigen::Vector3d(1, 2, 3); // 设置对角线
matA.triangularView<Eigen::Upper>();       // 提取上三角部分
matA.triangularView<Eigen::Lower>();       // 提取下三角部分

1.4 元素访问与操作

double value = matA(0, 1);                  // 按索引访问元素
matA.array() += 1;                         // 将矩阵视为数组进行逐元素操作
matA = matA.unaryExpr([](double x) { return std::sqrt(x); }); // 对每个元素应用函数

2. 矩阵运算

2.1 基本矩阵运算

Eigen::MatrixXd C = A + B;   // 矩阵加法
Eigen::MatrixXd D = A * B;   // 矩阵乘法
Eigen::MatrixXd E = A.cwiseProduct(B); // 按元素相乘
Eigen::MatrixXd F = A.cwiseQuotient(B); // 按元素相除

2.2 广播操作

Eigen::MatrixXd G = A.rowwise() + Eigen::VectorXd::Ones(3).transpose(); // 每行加向量
Eigen::MatrixXd H = A.colwise() * Eigen::VectorXd::Constant(3, 2);     // 每列乘标量

3. 矩阵分解

3.1 特征值分解

Eigen::EigenSolver<Eigen::MatrixXd> es(matA);
Eigen::VectorXd eigenvalues = es.eigenvalues().real(); // 提取特征值
Eigen::MatrixXd eigenvectors = es.eigenvectors().real(); // 提取特征向量

3.2 奇异值分解 (SVD)

Eigen::JacobiSVD<Eigen::MatrixXd> svd(matA, Eigen::ComputeThinU | Eigen::ComputeThinV);
Eigen::MatrixXd U = svd.matrixU();
Eigen::MatrixXd V = svd.matrixV();
Eigen::VectorXd S = svd.singularValues(); // 奇异值

3.3 QR 分解

Eigen::HouseholderQR<Eigen::MatrixXd> qr(matA);
Eigen::MatrixXd Q = qr.householderQ();
Eigen::MatrixXd R = qr.matrixQR().triangularView<Eigen::Upper>(); // 上三角矩阵

3.4 LU 分解

Eigen::FullPivLU<Eigen::MatrixXd> lu(matA);
Eigen::MatrixXd L = lu.matrixLU().triangularView<Eigen::Lower>(); // 下三角
Eigen::MatrixXd U = lu.matrixLU().triangularView<Eigen::Upper>(); // 上三角

3.5 Cholesky 分解

适用于正定矩阵。

Eigen::LLT<Eigen::MatrixXd> llt(matA);
Eigen::MatrixXd L = llt.matrixL(); // 下三角

4. 几何操作

4.1 基本类型

  • Eigen::Vector3d:三维向量
  • Eigen::Matrix3d:3x3 矩阵
  • Eigen::Quaterniond:四元数
  • Eigen::AngleAxisd:旋转轴-角度表示

4.2 旋转与变换

Eigen::AngleAxisd rotation(M_PI / 4, Eigen::Vector3d::UnitZ()); // 绕 Z 轴旋转 45 度
Eigen::Matrix3d rotationMatrix = rotation.toRotationMatrix(); // 转换为旋转矩阵

Eigen::Quaterniond quat(rotation);  // 从旋转创建四元数
Eigen::Quaterniond quat2(1, 0, 0, 0); // 手动创建四元数
Eigen::Quaterniond result = quat * quat2; // 四元数相乘

Eigen::Vector3d point(1, 0, 0);
Eigen::Vector3d rotatedPoint = rotation * point; // 旋转向量

4.3 仿射变换

Eigen::Affine3d transform = Eigen::Affine3d::Identity();
transform.translate(Eigen::Vector3d(1, 2, 3));    // 平移
transform.rotate(Eigen::AngleAxisd(M_PI / 4, Eigen::Vector3d::UnitZ())); // 旋转
Eigen::Vector3d transformedPoint = transform * Eigen::Vector3d(1, 0, 0); // 应用变换

5. 稀疏矩阵操作

5.1 构造稀疏矩阵

Eigen::SparseMatrix<double> sparseMat(4, 4);
sparseMat.insert(0, 1) = 3.14;   // 插入元素
sparseMat.coeffRef(2, 2) = 2.71; // 访问或修改元素
sparseMat.makeCompressed();      // 压缩存储

5.2 稀疏矩阵求解

Eigen::SparseLU<Eigen::SparseMatrix<double>> solver;
solver.compute(sparseMat);
Eigen::VectorXd x = solver.solve(Eigen::VectorXd::Ones(4)); // 解线性方程

6. 其他常用功能

6.1 随机生成与初始化

Eigen::MatrixXd randomMat = Eigen::MatrixXd::Random(3, 3); // 随机矩阵
Eigen::MatrixXd identityMat = Eigen::MatrixXd::Identity(3, 3); // 单位矩阵

6.2 条件判断与选择

Eigen::MatrixXd filtered = matA.unaryExpr([](double val) { return val > 0 ? val : 0; }); // 逐元素条件筛选

6.3 显示矩阵信息

std::cout << "Matrix A:\n" << matA << std::endl;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2265296.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

workman服务端开发模式-应用开发-vue-element-admin挂载websocket

一、项目根目录main.js添加全局引入 import /utils/websocket 二、在根目录app.vue 中初始化WebSocket连接 <template><div id"app"><router-view /></div> </template><script>import store from ./store export default {n…

2024-12-24 NO1. XR Interaction ToolKit 环境配置

文章目录 1 软件配置2 安装 XRToolKit3 配置 OpenXR4 安装示例场景5 运行测试 1 软件配置 Unity 版本&#xff1a;Unity6000.0.26 ​ 2 安装 XRToolKit 创建新项目&#xff08;URP 3D&#xff09;&#xff0c;点击进入 Asset Store。 进入“Unity Registry”页签&#xff0…

华为手机鸿蒙4.2连接不上adb

1、下载HiSuite华为手机助手 https://consumer.huawei.com/cn/support/hisuite/ 2、安装后点连接 3、就可以adb连接了

GitPuk安装配置指南

GitPuk是一款开源免费的代码管理工具&#xff0c;上篇文章已经介绍了Gitpuk的功能与优势&#xff0c;这篇文章将为大家讲解如何快速安装和配置GitPuk&#xff0c;助力你快速的启动GitPuk管理代码 1. 安装 支持 Windows、Mac、Linux、docker 等操作系统。 1.1 Windows安装 下载…

【从零开始入门unity游戏开发之——C#篇20】C#面向对象的封装——静态成员(`static`)(静态字段、静态方法、静态属性、静态构造函数、静态类)

文章目录 静态成员&#xff08;static&#xff09;1、静态成员的特点&#xff1a;2、为什么可以直接点出来使用&#xff1f;3、不同的静态成员介绍3.1. 静态字段3.2. 静态方法3.3. 静态属性3.4. 静态构造函数3.5. 静态类 4、静态成员的优缺点优点&#xff1a;缺点&#xff1a; …

【Yonghong 企业日常问题 06】上传的文件不在白名单,修改allow.jar.digest属性添加允许上传的文件SH256值?

文章目录 前言问题描述问题分析问题解决1.允许所有用户上传驱动文件2.如果是想只上传白名单的驱动 前言 该方法适合永洪BI系列产品&#xff0c;包括不限于vividime desktop&#xff0c;vividime z-suit&#xff0c;vividime x-suit产品。 问题描述 当我们连接数据源的时候&a…

我的JAVA-Web基础(2)

1.JDBC 防止sql注入 2.JSP JSP的基本语法 基本语法是 <% %> Java代码 <% %> 输出变量 可以转换成${变量}的EL表达式 <%! %>定义变量 JSP的基本语法包括以下几个主要部分&#xff1a; 1. 表达式&#xff08;Expression&#xff09; 表达式用于将…

新闻网站的个性化推荐:机器学习的应用

3.1可行性分析 开发者在进行开发系统之前&#xff0c;都需要进行可行性分析&#xff0c;保证该系统能够被成功开发出来。 3.1.1技术可行性 开发该新闻网站所采用的技术是vue和MYSQL数据库。计算机专业的学生在学校期间已经比较系统的学习了很多编程方面的知识&#xff0c;同时也…

IIC驱动EEPROM

代码参考正点原子 i2c_dri:主要是三段式状态机的编写 module iic_dri#(parameter SLAVE_ADDR 7b1010000 , //EEPROM从机地址parameter CLK_FREQ 26d50_000_000, //模块输入的时钟频率parameter I2C_FREQ 18d250_000 //IIC_SCL的时钟频率)( …

【动手学轨迹预测】2.3 场景表征方法

场景表征是指在所有可用的场景信息数据中, 提取出对于预测网络有用的数据, 并将其转换为易于模型学习的数据格式. 对于预测网络来说, 最重要的数据是交通参与者的历史轨迹和地图信息, 表达它们的常见方法有:栅格化和稀疏化 2.1.1 栅格化 多通道表达 如上图所示, 将历史轨迹和…

亚信安全举办“判大势 悟思想 强实践”主题党日活动

为深入学习和贯彻党的二十届三中全会精神&#xff0c;近日&#xff0c;亚信安全举办了 “学习贯彻党的二十届三中全会精神——‘判大势 悟思想 强实践’党日活动”&#xff0c;并取得圆满成功。 本次活动特邀南京市委宣讲团成员、南京市委党校市情研究中心主任王辉龙教授出席。…

医疗大模型威胁攻击下的医院AI安全:挑战与应对策略

一、引言 1.1 研究背景与意义 随着人工智能技术的迅猛发展,医疗大模型作为一种新兴的技术手段,正逐渐渗透到医疗领域的各个环节,为医疗服务的数字化转型带来了前所未有的机遇。从辅助诊断到疾病预测,从个性化治疗方案的制定到医疗资源的优化配置,医疗大模型展现出了巨大…

如何在谷歌浏览器中使用内置翻译功能

谷歌浏览器作为全球最受欢迎的网络浏览器之一&#xff0c;提供了强大且便捷的内置翻译功能。这一功能帮助用户轻松跨越语言障碍&#xff0c;浏览不同语言的网页内容。本文将详细介绍如何在谷歌浏览器中使用其内置翻译功能。 一、启用谷歌浏览器内置翻译功能 1、打开谷歌浏览器…

【MySQL】7.0 入门学习(七)——MySQL基本指令:帮助、清除输入、查询等

1.0 help &#xff1f; 帮助指令&#xff0c;查询某个指令的解释、用法、说明等。详情参考博文&#xff1a; 【数据库】6.0 MySQL入门学习&#xff08;六&#xff09;——MySQL启动与停止、官方手册、文档查询 https://www.cnblogs.com/xiaofu007/p/10301005.html 2.0 在cmd命…

基于推理的目标检测 DetGPT

基于推理的目标检测 DetGPT flyfish detgpt.github.io 近年来&#xff0c;由于大型语言模型&#xff08;LLMs&#xff09;的发展&#xff0c;计算机视觉领域取得了重大进展。这些模型使人类与机器之间能够进行更有效、更复杂的交互&#xff0c;为模糊人类与机器智能界限的新技…

概率论 期末 笔记

第一章 随机事件及其概率 利用“四大公式”求事件概率 全概率公式与贝叶斯公式 伯努利概型求概率 习题 推导 一维随机变量及其分布 离散型随机变量&#xff08;R.V&#xff09;求分布律 利用常见离散型分布求概率 连续型R.V相关计算 利用常见连续型分布的计算 均匀分布 正态…

探索 Python编程 调试案例:计算小程序中修复偶数的bug

在 学习Python 编程的过程里&#xff0c;会遇到各种各样的bug。而修复bug调试代码就像是一场充满挑战的侦探游戏。每一个隐藏的 bug 都是谜题&#xff0c;等待开发者去揭开真相&#xff0c;让程序可以顺利运行。今天&#xff0c;让我们通过一个实际案例&#xff0c;深入探索 Py…

Redis 介绍和安装

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 Redis 入门介绍 收录于专栏[redis] 本专栏旨在分享学习Linux的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 本章将带领读者进入 Redis 的世…

springboot480基于springboot高校就业招聘系统设计和实现(论文+源码)_kaic

摘 要 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff0c;还是可操作性等各个方面来讲&#xff0c;遇到了互联网时代才发现能补上自古…

【基础篇】1. JasperSoft Studio编辑器与报表属性介绍

编辑器介绍 Jaspersoft Studio有一个多选项卡编辑器&#xff0c;其中包括三个标签&#xff1a;设计&#xff0c;源代码和预览。 Design&#xff1a;报表设计页面&#xff0c;可以图形化拖拉组件设计报表&#xff0c;打开报表文件的主页面Source&#xff1a;源代码页码&#xff…