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

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.rhkb.cn/news/495292.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】ChatGLM-4-9B模型之All Tools

一、摘要 最近在研究GLM4模型&#xff0c;发现自带的All Tools比较感兴趣&#xff0c;它具有完整工具调用能力的对话模式&#xff0c;原生支持网页浏览、代码执行、图表生成、图片生成&#xff0c;并支持自定义工具。它能够满足大模型私有化部署的个性定制&#xff0c;因此记录…

Vue零基础必学教程(16) 计算属性

往期内容&#xff1a; Vue零基础必学教程&#xff08;5&#xff09;挂载 Vue零基础必学教程&#xff08;6&#xff09;基本选项 Vue零基础必学教程&#xff08;7&#xff09;模板 Vue零基础必学教程&#xff08;8&#xff09;模板语法 Vue零基础必学教程&#xff08;9&…

14:30面试,14:08就出来了,面试问的有点变态呀。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%,这…

【Leetcode】1705. 吃苹果的最大数目

文章目录 题目思路代码复杂度分析时间复杂度空间复杂度 结果总结 题目 题目链接&#x1f517; 有一棵特殊的苹果树&#xff0c;一连 n n n 天&#xff0c;每天都可以长出若干个苹果。在第 i i i 天&#xff0c;树上会长出 a p p l e s [ i ] apples[i] apples[i] 个苹果&a…

kimi搜索AI多线程批量生成txt原创文章软件-不需要账号及key

kimi搜索AI多线程批量生成txt原创文章软件介绍&#xff1a; 软件可以设置三种模型写文章&#xff1a;kimi&#xff1a;默认AI模型&#xff0c;kimi-search&#xff1a;联网检索模型 &#xff0c;kimi-research&#xff1a;探索版搜索聚合模型 1、可以设置写联网搜索文章&#…

游戏引擎学习第58天

发现一个vscode Log 断点的用法 回顾 我们正在继续推进工作&#xff0c;之前做了一些测试和清理工作&#xff0c;但还有一件事没有完成&#xff0c;因此我们还没有完全回到功能平衡的状态。昨天我们已经为实体做了空间划分&#xff0c;所以接下来的目标是继续完成这部分工作&a…

day14-16系统服务管理和ntp和防火墙

一、自有服务概述 服务是一些特定的进程&#xff0c;自有服务就是系统开机后就自动运行的一些进程&#xff0c;一旦客户发出请求&#xff0c;这些进程就自动为他们提供服务&#xff0c;windows系统中&#xff0c;把这些自动运行的进程&#xff0c;称为"服务" window…

Idea导入Springboot项目,无法正确加载yml文件,且不为绿色图标的解决办法

一、出现问题的环境 将项目复制新的环境后&#xff0c;.yml 文件不能显示为绿色&#xff0c;导致无法配置数据库。 二、解决办法。 在网上找了多种办法&#xff0c;并不适用&#xff0c;发现resources的显示也有问题&#xff0c;右击resources->Mark->Directory as -&g…

以太网通信--读取物理层PHY芯片的状态

PHY芯片通过MDIO接口进行读写&#xff0c;框图如下所示&#xff1a; 原理很简单&#xff0c;就是按照时序将PHY芯片的指定寄存器信息读出或者写入。 MDC时钟需要输出到PHY芯片&#xff0c;一般不低于80MHz。 MDIO是双向接口&#xff0c;FPGA读出状态信息时为输入&#xff0c;FP…

Doris Tablet 损坏如何应对?能恢复数据吗?

开门见山&#xff0c;能不能修&#xff1f; Doris 的 Tablet 损坏了&#xff0c;到底能不能修呢&#xff1f;数据会不会丢&#xff1f; 这玩意还真不好说&#xff1f; 哎&#xff0c;怎么又不好说了呢&#xff1f; 这个主要是因为下面的原因&#xff1a; Doris 数据的高可…

【Linux】查询磁盘空间被谁占用了

查询磁盘空间被谁占用了 先说下常见的几种原因&#xff1a; 1、删除的文件未释放空间 2、日志或过期文件未及时清理 3、inode导致 4、隐藏文件夹或者目录 6、磁盘碎片 最后一种单独介绍。 环境&#xff1a;情况是根分区&#xff08;/&#xff09;的总容量为44GB&#xf…

Scala课堂小结

(一)数组&#xff1a; 1.不可变数组 2创建数组

GitPuk安装配置指南

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

大恒相机开发(2)—Python软触发调用采集图像

大恒相机开发&#xff08;2&#xff09;—Python软触发调用采集图像 完整代码详细解读和功能说明扩展学习 这段代码是一个Python程序&#xff0c;用于从大恒相机采集图像&#xff0c;通过软件触发来采集图像。 完整代码 咱们直接上python的完整代码&#xff1a; # version:…

本科阶段最后一次竞赛Vlog——2024年智能车大赛智慧医疗组准备全过程——12使用YOLO-Bin

本科阶段最后一次竞赛Vlog——2024年智能车大赛智慧医疗组准备全过程——12使用YOLO-Bin ​ 根据前面内容&#xff0c;所有的子任务已经基本结束&#xff0c;接下来就是调用转化的bin模型进行最后的逻辑控制了 1 .YOLO的bin使用 ​ 对于yolo其实有个简单的办法&#xff0c;也…

Golang的容器化技术实践总结

Golang的容器化技术实践总结 一、容器化技术概述 什么是容器化技术 容器化技术是一种轻量级、可移植的虚拟化解决方案&#xff0c;它将应用程序、运行环境和依赖项打包到一个被称为容器的独立单元中。容器可以在不同的操作系统中运行&#xff0c;具有更高的资源利用率和更快的部…

修改el-select下拉框高度;更新:支持动态修改

文章目录 效果动态修改&#xff1a;效果代码固定高度版本动态修改高度版本&#xff08;2024-12-25 更新&#xff1a; 支持动态修改下拉框高度&#xff09; 效果 动态修改&#xff1a;效果 代码 固定高度版本 注意点&#xff1a; popper-class 尽量独一无二&#xff0c;防止影…

运动控制卡网络通讯的心跳检测之C#上位机编程

本文导读 今天&#xff0c;正运动小助手给大家分享一下如何使用C#上位机编程实现运动控制卡网络通讯的心跳检测功能。 01 ECI2618B硬件介绍 ECI2618B经济型多轴运动控制卡是一款脉冲型、模块化的网络型运动控制卡。控制卡本身最多支持6轴&#xff0c;可扩展至12轴的运动控制…

自动控制系统综合与LabVIEW实现

自动控制系统综合是为了优化系统性能&#xff0c;确保其可靠性、稳定性和灵活性。常用方法包括动态性能优化、稳态误差分析、鲁棒性设计等。结合LabVIEW&#xff0c;可以通过图形化编程、高效数据采集与处理来实现系统综合。本文将阐述具体方法&#xff0c;并结合硬件选型提供实…

lxml提取某个外层标签里的所有文本

html如下 <div data-v-1cf6f280"" class"analysis-content">选项D错误&#xff1a;<strong>在衡量通货膨胀时&#xff0c;</strong><strong>消费者物价指数使用得最多、最普遍</strong>。 </div> 解析html文本 fro…