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的整型矩阵,默认初始化为0
    cout<<"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 = b
     Eigen::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.mfbz.cn/a/606814.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

STM32G030C8T6:EEPROM读写实验(I2C通信)

本专栏记录STM32开发各个功能的详细过程&#xff0c;方便自己后续查看&#xff0c;当然也供正在入门STM32单片机的兄弟们参考&#xff1b; 本小节的目标是&#xff0c;系统主频64 MHZ,采用高速外部晶振&#xff0c;实现PB11,PB10 引脚模拟I2C 时序&#xff0c;对M24C08 的EEPRO…

面试常见 | 项目上没有亮点,如何包装?

很多技术人在公司用的老技术&#xff0c;而且很多都是搬业务代码且做枯燥乏味的CRUD&#xff0c;在面试提交简历或做自我介绍的时候并不突出&#xff0c;这种情况&#xff0c;如何破局&#xff1f; 首先不管你做的啥项目&#xff0c;全世界不可能只有你自己在做&#xff0c;比…

【MATLAB源码-第52期】基于matlab的4用户DS-CDMA误码率仿真,对比不同信道以及不同扩频码。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 DS-CDMA (Direct Sequence Code Division Multiple Access) 是一种多址接入技术&#xff0c;其基本思想是使用伪随机码序列来调制发送信号。DS-CDMA的特点是所有用户在同一频率上同时发送和接收信息&#xff0c;但每个用户使…

Leetcode—1396. 设计地铁系统【中等】

2024每日刷题&#xff08;127&#xff09; Leetcode—1396. 设计地铁系统 实现代码 class UndergroundSystem { public:typedef struct Checkin {string startStation;int time;} Checkin;typedef struct Checkout{int tripNum;int totalTime;} Checkout;UndergroundSystem()…

ANSI转义序列

一、ASCII码 ASCII&#xff08;American Standard Code for Information Interchange&#xff0c;美国信息交换标准代码&#xff09;最初的设计是一个7位的字符编码&#xff0c;使用了从0到127的数字来表示字符。这意味着它总共可以表示128个不同的字符。这包括了英文大小写字…

vue+ant-design+formBuiler表单构建器——技能提升——form design——亲测有效

最近看到后端同事在弄一个后台管理系统&#xff0c;额&#xff0c;前端真的是夹缝中生存啊&#xff0c;AI抢饭碗&#xff0c;后端也想干前端的活儿。。。 他用到了表单构建器&#xff0c;具体效果如下: 网上有很多适用于ElementUi和ant-design的form design插件&#xff0c;下…

深度学习Day-16:实现天气预测

&#x1f368; 本文为&#xff1a;[&#x1f517;365天深度学习训练营] 中的学习记录博客 &#x1f356; 原作者&#xff1a;[K同学啊 | 接辅导、项目定制] 要求&#xff1a;根据提供的数据集对RainTomorrow进行预测 一、 基础配置 语言环境&#xff1a;Python3.7编译器选择…

CSS伪类选择器

目录 前言&#xff1a; 链接伪类&#xff1a; 用户行为伪类&#xff1a; 元素状态伪类&#xff1a; 结构化伪类&#xff1a; 否定伪类&#xff1a; 目标伪类&#xff1a; 输入伪类&#xff1a; 前言&#xff1a; 在CSS中有一种特殊的选择器&#xff1a;伪类选择器&…

3D翻页电子画册制作零基础制作

随着科技的不断发展&#xff0c;3D翻页电子画册逐渐成为了一种流行的展示方式。它不仅具有丰富的视觉冲击力&#xff0c;还能带来更好的用户体验。如果你是零基础&#xff0c;不用担心&#xff0c;我将为你详细介绍如何制作3D翻页电子画册。让你轻松入门&#xff0c;创作出属于…

DUX 主题 版本:8.2 WordPress主题优化版

主题下载地址&#xff1a;DUX 主题优化版.zip 支持夜间模式、快讯、专题、百度收录、人机验证、多级分类筛选&#xff0c;适用于垂直站点、科技博客、个人站&#xff0c;扁平化设计、简洁白色、超多功能配置、会员中心、直达链接、自动缩略图

【qt】QString字符串

前言&#xff1a; 这节很轻松&#xff0c;大家可以放心食用 ♪(&#xff65;ω&#xff65;)&#xff89; QString目录 一.与cString的区别二.隐式共享三.初始化四.判断是否为空串五.字符串的长度六.添加字符串1.尾加2.任意位置加 七.替换字符串八.修改字符串九.删除字符串1.清…

Elastic 基于 RAG 的 AI 助手:利用 LLM 和私有 GitHub 问题分析应用程序问题

作者&#xff1a;来自 Elastic Bahubali Shetti 作为 SRE&#xff0c;分析应用程序比以往更加复杂。 你不仅必须确保应用程序以最佳状态运行以确保良好的客户体验&#xff0c;而且还必须了解某些情况下的内部工作原理以帮助排除故障。 分析基于生产的服务中的问题是一项团队运动…

EOCR-DS3T-05S电动机保护器 施耐德 EOCR-DS3系列

EOCR-DS3T-05S电动机保护器 施耐德 EOCR-DS3系列型号&#xff1a; EOCR-DS3-05S EOCR-DS3-30S EOCR-DS3-60S EOCR-DS3T-05S EOCR-DS3T-30S EOCR-DS3T-60S 基于MCU&#xff08;微处理器&#xff09;的2CT型产品 ■ 实时处理/高精度 ■ 电流设定范围&#xff1a;05型&#xff1…

【SpringBoot整合系列】SpringBoot整合Thymeleaf

目录 背景Thymeleaf简介Thymeleaf的特征模板引擎是什么 代码示例1.引入依赖2.修改配置文件&#xff0c;添加Thymeleaf的配置信息3.编写HTML模板文件4.编写控制器&#xff0c;返回ModelAndView&#xff0c;进行视图渲染 Thymeleaf语法1.常用标签/属性1.1 th:action1.2 th:method…

SpringBoot 使用Outlook邮箱发送邮件

目录 一、开启Outlook设置 二、依赖 三、配置文件 四、代码调用 一、开启Outlook设置 开启设置如图&#xff1a; 二、依赖 <!-- 邮箱依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mai…

Java -- (part25)

一.Junit单元测试 1.概述 是一个单元测试框架,可以代替main方法去执行其他的方法 2.使用 a.导入jar包 b.注解 Test:单独执行一个方法 Before:在Test之前执行,有几个Test就有几个Before After:在Test之后执行,有几个Test就有几个After 二.类的加载机制 1.类的加载时机…

七款好用的上网行为管理软件推荐 |有没有好用的上网行为管理系统

七款好用的上网行为管理软件推荐 |有没有好用的上网行为管理系统 员工上班刷视频&#xff01; 员工上班炒股&#xff01; 员工上班干副业&#xff01; 碰见这种情况怎么办&#xff1f;当然是用电脑监控软件来监视员工的一举一动了&#xff0c;那么这样的软件有哪些呢&#…

充电桩测试:选择适合的负载箱

随着电动汽车的普及&#xff0c;充电桩的需求也在不断增加。为了保证充电桩的性能和安全&#xff0c;对其进行测试是非常重要的。在充电桩测试过程中&#xff0c;选择合适的负载箱是关键。本文将介绍如何选择合适的负载箱进行充电桩测试。 在进行充电桩测试之前&#xff0c;首先…

思腾合力受邀参加VALSE 2024视觉与学习青年学者研讨会

在充满学术氛围的五月&#xff0c;思腾合力荣幸受邀参加了于2024年5月5-7日在重庆举行的第十四届VALSE大会。作为视觉与学习领域的顶级交流平台&#xff0c;VALSE大会每年都吸引着全国专家与学者的目光。 本次大会不仅延续了往届的高水平学术研讨&#xff0c;还进一步拓宽了研究…

【CTF-Crypto】RSA-选择明密文攻击 一文通

RSA&#xff1a;选择明密文攻击 关于选择明/密文攻击&#xff0c;其实这一般是打一套组合拳的&#xff0c;在网上找到了利用的思路&#xff0c;感觉下面这个题目是真正将这个问题实现了&#xff0c;所以还是非常棒的一道题&#xff0c;下面先了解一下该知识点&#xff1a;(来自…
最新文章