C++之Eigen库基本使用

目录

1、矩阵的构造和初始化操作

2、矩阵的算术运算

3、矩阵的分解和求解

4、矩阵的变换

5、矩阵的访问和修改

6、矩阵遍历

7、线性方程组求解

8、其他操作


Eigen库是一个高级的C++库,用于线性代数,矩阵和向量运算,数值分析和相关的数学运算。这个库提供了大量的矩阵操作功能。

1、矩阵的构造和初始化操作

Eigen::Matrix3f A; // 创建一个3x3的双精度浮点型矩阵A << 1, 2, 3,  4, 5, 6,  7, 8, 9;cout<<"3X3 float: \n"<<A<<endl;Eigen::MatrixXf m = Eigen::MatrixXf::Identity(3, 3); // 创建一个3x3的单位矩阵cout<<"3X3 identity: \n"<<m<<endl;Eigen::MatrixXf mf(3, 3); // 使用构造函数初始化,默认初始化为0 Eigen::MatrixXi mi(3, 3); // 创建一个3x3的整型矩阵,默认初始化为0cout<<"3X3 mf: \n"<<mf<<endl;cout<<"3X3 mi: \n"<<mi<<endl;Eigen::MatrixXf z = Eigen::MatrixXf::Zero(3, 3); // 创建一个3x3的全0矩阵Eigen::MatrixXi n = Eigen::MatrixXi::Ones(3, 3); // 创建一个3x3的全1矩阵cout<<"3X3 Zero: \n"<<z<<endl;cout<<"3X3 Ones: \n"<<n<<endl;Eigen::MatrixXf r = Eigen::MatrixXf::Random(3, 3); // 创建一个3x3的随机矩阵cout<<"3X3 random: \n"<<r<<endl;float data[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9};Eigen::Map<Eigen::MatrixXf> mp(data, 3, 3); // 将data数组映射为一个3x3的矩阵cout<<"3X3 map mp: \n"<<mp<<endl;Eigen::MatrixXf m_i(3, 3);m_i = (Eigen::MatrixXf(3, 3)<<1, 2, 3, 4, 5, 6, 7, 8, 9).finished(); //对于动态大小的矩阵,可以使用逗号初始化器,但需要在初始化时指定大小cout<<"initializer m_i: \n"<<m_i<<endl;Eigen::MatrixXf m_c = m_i;cout<<"copy constructor m_c : \n"<<m_c<<endl;

2、矩阵的算术运算

Eigen::MatrixXf m1 = Eigen::MatrixXf::Identity(3, 3);Eigen::MatrixXf m2 = Eigen::MatrixXf::Identity(3, 3);Eigen::Matrix3f sum = m1 + m2; // 矩阵加法 cout<<"sum : \n"<<sum<<endl;Eigen::MatrixXf diff = m1 + m2; // 矩阵减法 cout<<"diff : \n"<<diff<<endl;Eigen::MatrixXf scaled = m1 * 2.0f; // 矩阵与标量的乘法 cout<<"scaled : \n"<<scaled<<endl;Eigen::MatrixXf product = m1 * m2.transpose(); // 矩阵乘法cout<<"product : \n"<<product<<endl;// 矩阵加法
Eigen::Matrix3f C = A + A;// 矩阵乘法
Eigen::Matrix3f D = A * A.transpose();// 向量加法
Eigen::Vector4f e = b + b;// 点积(内积)
float dotProduct = b.dot(b);// 转置
std::cout << "Transpose of A:\n" << A.transpose() << std::endl;// 访问元素
std::cout << "Element (1, 1) of A: " << A(1, 1) << std::endl;

3、矩阵的分解和求解

Eigen::MatrixXf m1 = Eigen::Matrix3f::Random();cout << "original matrix:\n" << m1 << endl;// 对矩阵进行特征值分解Eigen::EigenSolver<Eigen::Matrix3f> es(m1);cout << "eigenvalues:\n" << es.eigenvalues() << endl; cout << "eigenvectors:\n" << es.eigenvectors() << endl; // 假设我们有一个线性方程组 Ax = bEigen::Vector3f b(1, 2, 3);cout << "vector b:\n" << b << endl;// 使用列主元QR分解求解线性方程组Eigen::Vector3f x = m1.colPivHouseholderQr().solve(b);cout << "Solution x:\n" << x << endl;

4、矩阵的变换

Eigen::MatrixXf m1 = Eigen::Matrix4f::Random();cout << "original matrix:\n" << m1 << endl;// 获取矩阵的转置 Eigen::Matrix4f transposed = m1.transpose();cout << "transposed:\n" << transposed << endl; // 获取矩阵的对角线元素Eigen::Vector4f diagonal = m1.diagonal();cout << "diagonal:\n" << diagonal << endl; // 获取矩阵的逆(注意:需要先检查矩阵是否可逆)if(m1.determinant() != 0) // 使用行列式检查是否可逆{// 求逆矩阵Eigen::Matrix4f inv_m = m1.inverse();cout << "inverse:\n" << inv_m << endl; // 验证逆矩阵的正确性:m * inv_m 应该接近单位矩阵Eigen::MatrixXf identity_check = m1 * inv_m;cout << "identity check:\n" << identity_check << endl; }else {  cerr << "Matrix is singular and cannot be inverted." << endl;  } 

5、矩阵的访问和修改

 Eigen::MatrixXf m1 = Eigen::Matrix4f::Random();cout << "original matrix:\n" << m1 << endl;// 取出前3行和前3列的子矩阵Eigen::Matrix3f sub_matrix = m1.block(0, 0, 3, 3);cout << "sub_matrix:\n" << sub_matrix << endl;// 修改矩阵的元素  m1(1, 2) = 10; // 将第2行第3列的元素设置为10// 访问矩阵的元素cout << "Element at (1, 2): " << m1(1, 2) << endl;// 访问矩阵的第2行  Eigen::Vector4f row = m1.row(1);cout << "row 2: " << row << std::endl;// 访问矩阵的第2列  Eigen::Vector4f col = m1.col(1);cout << "col 2: " << col << std::endl;Eigen::MatrixXf m2 = Eigen::Matrix3f::Random();cout << "original matrix:\n" << m2 << endl;// 创建一个4x4的矩阵,并初始化 Eigen::Matrix4f m4_4= Eigen::Matrix4f::Zero();// 将3x3矩阵赋值给4x4矩阵的前3行和前3列  m4_4.block(0, 0, 3, 3) = m2;cout << "4x4 matrix with 3x3 block assigned:\n" << m4_4 << endl;
//块操作
// 提取矩阵的第二列
Eigen::Vector3f column = A.col(1);// 提取矩阵的前两行
Eigen::Matrix2f topRows = A.topRows(2);

6、矩阵遍历

3.1 使用迭代器遍历和打印#include <iostream>
#include <Eigen/Dense>int main() {Eigen::MatrixXd mat(3, 4);mat << 1, 2, 3, 4,5, 6, 7, 8,9, 0, 1, 2;// 遍历并打印矩阵的每一行for (int row = 0; row < mat.rows(); ++row) {for (Eigen::MatrixXd::RowIterator it = mat.row(row).begin(); it != mat.row(row).end(); ++it) {std::cout << *it << ' ';}std::cout << '\n';}Eigen::VectorXd vec(5);vec << 3, 6, 9, 12, 15;// 遍历并打印向量的所有元素for (Eigen::VectorXd::Iterator it = vec.begin(); it != vec.end(); ++it) {std::cout << *it << ' ';}std::cout << '\n';return 0;
}3.2 直接访问元素并打印
#include <iostream>
#include <Eigen/Dense>int main() {Eigen::MatrixXd mat(3, 4);mat << 1, 2, 3, 4,5, 6, 7, 8,9, 0, 1, 2;// 遍历并打印矩阵的每一行for (int row = 0; row < mat.rows(); ++row) {for (int col = 0; col < mat.cols(); ++col) {std::cout << mat(row, col) << ' ';}std::cout << '\n';}Eigen::VectorXd vec(5);vec << 3, 6, 9, 12, 15;// 遍历并打印向量的所有元素for (int i = 0; i < vec.size(); ++i) {std::cout << vec(i) << ' ';}std::cout << '\n';return 0;
}

7、线性方程组求解

// 假设A是已知的系数矩阵,b是已知的右侧向量
Eigen::VectorXd x;
Eigen::MatrixXd A(3, 3);
Eigen::VectorXd b(3);// ... 初始化A和b ...// 使用LLT分解求解Ax=b
Eigen::LLT<Eigen::MatrixXd> llt(A);
if (llt.info() == Eigen::Success) {x = llt.solve(b);
} else {std::cerr << "LLT decomposition failed!" << std::endl;
}// 输出解
std::cout << "Solution: " << x << std::endl;

8、其他操作

Eigen::Matrix3f m1; // 创建一个3x3的双精度浮点型矩阵m1 << 1, 2, 3,  4, 5, 6,  7, 8, 9;// 计算矩阵的Frobenius范数float norm = m1.norm();cout << "norm of the matrix: " << norm << endl;Eigen::Matrix3f m2; // 创建一个3x3的双精度浮点型矩阵m2 << 1, 2, 3,  4, 5, 6,  7, 8, 9.0001f;// 检查两个矩阵是否近似相等(这里使用1e-5作为精度阈值)bool are_approx = m1.isApprox(m2, 1e-5);cout << "are m1 and m2 approximately equal? " << (are_approx ? "Yes" : "No") << endl;

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

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

相关文章

【智能算法】人工原生动物优化算法(APO)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献5.获取代码 1.背景 2024年&#xff0c;X Wang受到自然界原生动物启发&#xff0c;提出了人工原生动物优化算法&#xff08; Artificial Protozoa Optimizer, APO&#xff09;。 2.算法原理 2.1算法思想 AP…

压缩归档库-Snappy介绍

1.简介 Snappy 是一个 C 编写的压缩和解压缩库&#xff0c;由 Google 开发。它专为速度而设计&#xff0c;而不是最大压缩率或与其他压缩库的兼容性。 Snappy 通常用于需要快速压缩和解压缩的场景。 Snappy具有以下属性&#xff1a; 快速&#xff1a;压缩速度达到250 MB/秒及…

数智化快速开发平台

助力企业IT规划标准化&#xff0c;实现企业IT生态化 目前市场上有很多面向企业各种业务场景的产品&#xff0c;这些产品给企业管理带来便利性的同时&#xff0c;也带来了一系列问题&#xff0c;例如&#xff1a; 不同系统的后台管理功能基本一致&#xff0c;却需要重复建设&a…

linux调试

文章目录 1. 使用打印来调试1.1 重定向1.2 标准预定义宏1.3 日志代码 2. 内核异常2.1 内核打印2.1.1 打印级别2.1.2 跟踪异常2.1.3 动态打印2.1.4 RAM console 2.2 OOPS2.2.1 有源代码的情况2.2.2 没有源代码的情况 3 查看日志4 工具调试 1. 使用打印来调试 1.1 重定向 2>…

代码随想录学习Day 33

动态规划理论基础 动态规划&#xff0c;英文&#xff1a;Dynamic Programming&#xff0c;简称DP&#xff0c;如果某一问题有很多重叠子问题&#xff0c;使用动态规划是最有效的。所以动态规划中每一个状态一定是由上一个状态推导出来的&#xff0c;这一点就区分于贪心&#x…

[Collection与数据结构] Map与Set(一):二叉搜索树与Map,Set的使用

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏:&#x1f355; Collection与数据结构 (91平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm1001.2014.3001.5482 &#x1f9c0;Java …

python socket通讯 学习记录

python socket 1. 初级实现2. 添加header3. 中级实现&#xff08;引用pickle库&#xff09;4. 高级实现&#xff08;相互发送信息&#xff09;5. 一点尝试5. 1个server对应2个client5.2个server对应1个client 名称版本python3.11 本文涉及到socket的server与client通讯从简单到…

LeetCode 257. 二叉树的所有路径

LeetCode 257. 二叉树的所有路径 1、题目 题目链接&#xff1a;257. 二叉树的所有路径 给你一个二叉树的根节点 root &#xff0c;按 任意顺序 &#xff0c;返回所有从根节点到叶子节点的路径。 叶子节点 是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root…

java.net.SocketInputStream.socketRead0 卡死导致 tomcat 线程池打满的问题

0 TL;DR; 问题与原因&#xff1a;某些特定条件下 java.net.SocketInputStream.socketRead0 方法会卡死&#xff0c;导致运行线程一直被占用导致泄露采用的方案&#xff1a;使用监控线程异步监控卡死事件&#xff0c;如果发生直接关闭网络连接释放链接以及对应的线程 1. 问题 …

【视频格式转换】【ffmepg】对mp4文件进行重新编码输出新的mp4文件

【视频格式转换】【ffmepg】对mp4文件进行重新编码输出新的mp4文件 背景 之前开发调试了个能正常调用ffmpeg解码mp4文件得到yuv数据的testbed(把ffmpeg开源库移植并交叉编译到一个嵌入式平台)&#xff0c;用了好几年了&#xff0c;今天用来挂测一批新的采集视频mp4文件&#x…

nacos下载安装和nacos启动报错

nacos简介: Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称&#xff0c;一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集&#xff0c;帮助您…

YOLOv9中模块总结补充|RepNCSPELAN4详图

专栏地址&#xff1a;目前售价售价69.9&#xff0c;改进点70 专栏介绍&#xff1a;YOLOv9改进系列 | 包含深度学习最新创新&#xff0c;助力高效涨点&#xff01;&#xff01;&#xff01; 1. RepNCSPELAN4详图 RepNCSPELAN4是YOLOv9中的特征提取-融合模块&#xff0c;类似前几…

【数据结构-二叉搜索树的增删查改】

&#x1f308;个人主页&#xff1a;努力学编程’ ⛅个人推荐&#xff1a;基于java提供的ArrayList实现的扑克牌游戏 |C贪吃蛇详解 ⚡学好数据结构&#xff0c;刷题刻不容缓&#xff1a;点击一起刷题 &#x1f319;心灵鸡汤&#xff1a;总有人要赢&#xff0c;为什么不能是我呢 …

C#面试题: 寻找中间值

给定一个数组&#xff0c;在区间内从左到右查找中间值&#xff0c;每次查找最小值与最大值区间内的中间值&#xff0c;且这个区间元素数量不小于3。 例如 1.给定数组float[] data { 1, 2.3f, 4, 5.75f, 8.125f, 10.5f, 13, 15, 20 } 输出&#xff1a;10.5、5.75、4、2.3、8…

[虚拟机+单机]梦幻契约H5修复版_附GM工具

本教程仅限学习使用&#xff0c;禁止商用&#xff0c;一切后果与本人无关&#xff0c;此声明具有法律效应&#xff01;&#xff01;&#xff01;&#xff01; 教程是本人亲自搭建成功的&#xff0c;绝对是完整可运行的&#xff0c;踩过的坑都给你们填上了 视频演示 [虚拟机单…

vue2人力资源项目2登录接口、跳转主页

用户名和密码 解决跨域问题 1.在vue.config.js里配置 proxy: {// 如果请求地址里有api&#xff0c;就转成这个地址/api: {target: https://heimahr.itheima.net/}}// before: require(./mock/mock-server.js)}, axios封装 utils/request.js import axios from axios// creat…

Linux-信号执行

1. 信号什么时候被处理 当进程从内核态返回到用户态的时候&#xff0c;进行信号的检测和处理 什么内核态&#xff0c;什么又是用户态呢&#xff1f; 当进程在CPU上运行时&#xff0c;内核态&#xff1a;允许进程访问操作系统的代码和数据&#xff0c;用户态&#xff1a;进程只…

导航栏与内容板块联动

目的&#xff1a; 实现点击导航栏内容页面滑动到对应内容区域页面滑动到某一区域&#xff0c;导航栏对应内容颜色发生改变 HTML代码&#xff1a; 导航栏设置id&#xff0c;内容区域设置对应id&#xff0c;实现查询 <nav><ul><li><a href"#sectio…

【C++风云录】解码气象数据:六大工具的对比分析

天气研究和预测模型 前言 在这个高度依赖科技的时代&#xff0c;预测和理解天气模式已成为重要的需求。本文将探讨六种不同的大气研究和数据处理工具&#xff1a;WRF, MeteoIO, NetCDF, CDO, UCSimply 和 GribApi。这些工具都分别介绍了概述&#xff0c;功能特性以及使用案例…

户口本翻译件怎么处理?

户口本是中国公民的重要证件&#xff0c;由中华人民共和国公安部精心制作&#xff0c;不仅是国内身份的凭证&#xff0c;更是走向世界的一张关键名片。对于想出国留学 、追求移民生活或是追寻异国风情的旅行者来说&#xff0c;户口本翻译件都是不可或缺的一部分。那么&#xf…