C++笔记之Eigen库的使用

C++笔记之Eigen库的使用

code review!

文章目录

  • C++笔记之Eigen库的使用
    • 0.矩阵构造和矩阵初始化
    • 1.声明一个2\*3的float矩阵:Matrix<float, 2, 3> matrix_23;
    • 2.初始化Matrix<float, 2, 3> matrix_23;
      • - 使用逗号初始化器:
      • - 使用赋值运算符逐个赋值:
    • 3.声明一个3维向量Vector3d
      • - Vector3d v_3d;
      • - Matrix<double, 3, 1> vd_3d;
    • 4.初始化Vector3d
    • 5.初始化Matrix<float, 3, 1> vd_3d
    • 6.将3维向量或矩阵初始化为零
    • 7.将向量或矩阵初始化为零
    • 8.动态大小的二维矩阵
    • 9.矩阵和向量元素访问
    • 10.矩阵和矩阵相乘
    • 11.矩阵和向量相乘
    • 12.eigen中的成员函数colwise()
    • 13.矩阵相乘前的类型转换
    • 14.矩阵转置
    • 15.矩阵四则运算中的加减
    • 16.矩阵除以标量(矩阵的数乘)
    • 17.矩阵乘以标量(矩阵的数乘)
    • 18.矩阵各元素和
    • 19.矩阵的迹
    • 20.矩阵的逆
    • 21.矩阵除法(实际上是矩阵与逆矩阵的乘法)
    • 23.矩阵的行列式
    • 24.矩阵的特征值和特征向量
    • 25.使用Eigen库中的SelfAdjointEigenSolver类来计算一个3x3矩阵的特征值和特征向量
    • 26.解线性方程组 Ax = b,使用LU分解
    • 27.解线性方程组 Ax = b,使用QR分解
    • 27.解线性方程组 Ax = b,使用Cholesky分解
    • 28.将旋转向量转为旋转矩阵
    • 29.将旋转矩阵转为旋转向量
    • 30.使用旋转向量对向量进行旋转的坐标变换
    • 31.将旋转矩阵转换为欧拉角
    • 32.创建欧氏变换矩阵
    • 33.使用变换矩阵进行坐标变换
    • 34.创建四元数
    • 35.使用四元数旋转向量
    • 36.使用刚体变换(欧氏变换)来进行旋转和平移操作
    • 37.eigen的数据类型
    • 38.eigen的block()函数
    • 39.eigen中的.col()和.row()方法
    • 40.eigen的点乘和叉乘.dot()和.cross()
    • 41.元素乘积.prod()——即向量中所有元素的乘积
    • 42.元素均值.mean()
    • 43.查找向量或矩阵中的最小值和最大值minCoeff()和maxCoeff()
    • 44.生成随机矩阵random()
    • 45.用于处理数组(元素级操作)的数据结构Array类
    • 46.eigen中Array类的常见操作

0.矩阵构造和矩阵初始化

在这里插入图片描述

1.声明一个2*3的float矩阵:Matrix<float, 2, 3> matrix_23;

在这里插入图片描述

2.初始化Matrix<float, 2, 3> matrix_23;

- 使用逗号初始化器:

在这里插入图片描述

- 使用赋值运算符逐个赋值:

在这里插入图片描述

3.声明一个3维向量Vector3d

下述两种方法是等价的

- Vector3d v_3d;

- Matrix<double, 3, 1> vd_3d;

在这里插入图片描述

4.初始化Vector3d

在这里插入图片描述

5.初始化Matrix<float, 3, 1> vd_3d

在这里插入图片描述

6.将3维向量或矩阵初始化为零

在这里插入图片描述

7.将向量或矩阵初始化为零

在这里插入图片描述

8.动态大小的二维矩阵

在这里插入图片描述

9.矩阵和向量元素访问

在这里插入图片描述

10.矩阵和矩阵相乘

在这里插入图片描述

11.矩阵和向量相乘

  • 方法一:使用矩阵乘法运算符
    在这里插入图片描述

  • 方法二:使用矩阵的 dot() 成员函数
    在这里插入图片描述

12.eigen中的成员函数colwise()

在这里插入图片描述

13.矩阵相乘前的类型转换

在这里插入图片描述

14.矩阵转置

在这里插入图片描述

15.矩阵四则运算中的加减

在这里插入图片描述

16.矩阵除以标量(矩阵的数乘)

在这里插入图片描述

17.矩阵乘以标量(矩阵的数乘)

在这里插入图片描述

18.矩阵各元素和

在这里插入图片描述

19.矩阵的迹

在这里插入图片描述

20.矩阵的逆

在这里插入图片描述

21.矩阵除法(实际上是矩阵与逆矩阵的乘法)

在这里插入图片描述

23.矩阵的行列式

在这里插入图片描述

24.矩阵的特征值和特征向量

在这里插入图片描述

25.使用Eigen库中的SelfAdjointEigenSolver类来计算一个3x3矩阵的特征值和特征向量

在这里插入图片描述

这个示例演示了使用Eigen库中的SelfAdjointEigenSolver类来计算一个3x3矩阵的特征值和特征向量。它首先创建一个对称矩阵 matrix_33,然后通过计算其转置与自身的乘积来准备进行特征值和特征向量计算。

分析:

  • Eigen::Matrix3d 表示一个3x3的矩阵,matrix_33 是我们创建的对称矩阵。
  • SelfAdjointEigenSolver<Eigen::Matrix3d> 是特征值和特征向量求解器的类型,这里使用 SelfAdjointEigenSolver 类来处理对称矩阵。
  • eigen_solver 是我们创建的特征值和特征向量求解器的实例,它在被构造时会计算给定矩阵的特征值和特征向量。
  • eigen_solver.eigenvalues() 用于获取计算得到的特征值,它返回一个向量,表示矩阵的特征值。
  • eigen_solver.eigenvectors() 用于获取计算得到的特征向量,它返回一个矩阵,其中每一列是一个特征向量。

确保你已经将Eigen库的头文件路径和库链接路径适配到你的项目配置中,然后编译并运行上述代码。你将会看到特征值和特征向量的输出。这个示例演示了如何使用Eigen库来进行矩阵的特征值和特征向量计算。

26.解线性方程组 Ax = b,使用LU分解

在这里插入图片描述

代码

#include <iostream>
#include <Eigen/Dense>

int main() {
    // 创建一个系数矩阵A和一个常数向量b
    Eigen::MatrixXd A(3, 3);
    A << 2, -1, 0,
         -1, 2, -1,
         0, -1, 2;

    Eigen::VectorXd b(3);
    b << 1, 2, 3;

    // 解线性方程组 Ax = b
    Eigen::VectorXd x = A.fullPivLu().solve(b);

    std::cout << "Coefficient Matrix A:\n" << A << "\n";
    std::cout << "Constant Vector b:\n" << b << "\n";
    std::cout << "Solution Vector x:\n" << x << "\n";

    return 0;
}

27.解线性方程组 Ax = b,使用QR分解

在这里插入图片描述

代码

#include <iostream>
#include <Eigen/Dense>

int main() {
    // 创建一个系数矩阵A和一个常数向量b
    Eigen::MatrixXd A(3, 3);
    A << 2, -1, 0,
         -1, 2, -1,
         0, -1, 2;

    Eigen::VectorXd b(3);
    b << 1, 2, 3;

    // 进行QR分解
    Eigen::ColPivHouseholderQR<Eigen::MatrixXd> qr(A);
    
    // 解线性方程组 Ax = b
    Eigen::VectorXd x = qr.solve(b);

    std::cout << "Coefficient Matrix A:\n" << A << "\n";
    std::cout << "Constant Vector b:\n" << b << "\n";
    std::cout << "Solution Vector x:\n" << x << "\n";

    return 0;
}

27.解线性方程组 Ax = b,使用Cholesky分解

在C++中,你可以使用Eigen库进行Cholesky分解来解决线性方程组。Cholesky分解是一种用于对称正定矩阵的分解方法,可以有效地解决线性方程组。以下是一个使用Eigen库进行Cholesky分解解线性方程组的示例代码:

在这里插入图片描述

在这个示例中,我们首先创建一个系数矩阵 A 和一个常数向量 b,代表线性方程组 Ax = b。然后使用LLT类进行Cholesky分解,如果分解成功(正定矩阵才能成功分解),就调用solve(b)方法来解线性方程组并计算得到解向量 x

请注意,Cholesky分解适用于对称正定矩阵。在使用之前,你应该确保矩阵 A 是对称正定的。如果矩阵不满足这些条件,Cholesky分解将会失败。

确保你已经将Eigen库的头文件路径和库链接路径适配到你的项目配置中,然后编译并运行上述代码。你将会看到系数矩阵、常数向量和解向量的输出。这个示例演示了如何使用Eigen库进行Cholesky分解来解决线性方程组。
代码

#include <iostream>
#include <Eigen/Dense>

int main() {
    // 创建一个系数矩阵A和一个常数向量b
    Eigen::MatrixXd A(3, 3);
    A << 4, 2, 2,
         2, 5, 1,
         2, 1, 6;

    Eigen::VectorXd b(3);
    b << 4, 6, 7;

    // 进行Cholesky分解
    Eigen::LLT<Eigen::MatrixXd> lltOfA(A);
    if (lltOfA.info() == Eigen::Success) {
        // 解线性方程组 Ax = b
        Eigen::VectorXd x = lltOfA.solve(b);

        std::cout << "Coefficient Matrix A:\n" << A << "\n";
        std::cout << "Constant Vector b:\n" << b << "\n";
        std::cout << "Solution Vector x:\n" << x << "\n";
    } else {
        std::cout << "Cholesky decomposition failed!" << std::endl;
    }

    return 0;
}

28.将旋转向量转为旋转矩阵

在这里插入图片描述

代码

#include <iostream>
#include <Eigen/Dense>

int main() {
    using namespace Eigen;

    // 创建一个旋转向量,绕 Z 轴旋转 45 度
    AngleAxisd rotation_vector(M_PI / 4, Vector3d(0, 0, 1));

    // 将旋转向量转换为旋转矩阵
    Matrix3d rotation_matrix = rotation_vector.toRotationMatrix();

    // 输出旋转向量
    std::cout << "Rotation Vector: " << rotation_vector.angle() << " around "
              << rotation_vector.axis().transpose() << "\n";

    // 输出旋转矩阵
    std::cout << "Rotation Matrix:\n" << rotation_matrix << "\n";

    return 0;
}

29.将旋转矩阵转为旋转向量

在这里插入图片描述

代码

#include <iostream>
#include <Eigen/Dense>

int main() {
    using namespace Eigen;

    // 创建一个旋转矩阵,绕 Z 轴旋转 45 度
    Matrix3d rotation_matrix;
    rotation_matrix << 0.707107, -0.707107, 0,
                      0.707107, 0.707107, 0,
                      0, 0, 1;

    // 从旋转矩阵中获取旋转向量
    AngleAxisd rotation_vector(rotation_matrix);

    // 输出旋转向量的角度和轴
    std::cout << "Rotation Angle: " << rotation_vector.angle() << " radians\n";
    std::cout << "Rotation Axis: " << rotation_vector.axis().transpose() << "\n";

    return 0;
}

30.使用旋转向量对向量进行旋转的坐标变换

在这里插入图片描述

31.将旋转矩阵转换为欧拉角

在这里插入图片描述

32.创建欧氏变换矩阵

在这里插入图片描述

33.使用变换矩阵进行坐标变换

在这里插入图片描述

34.创建四元数

在这里插入图片描述

35.使用四元数旋转向量

在这里插入图片描述

36.使用刚体变换(欧氏变换)来进行旋转和平移操作

在这里插入图片描述

代码

#include <iostream>
#include <vector>
#include <algorithm>
#include <Eigen/Core>
#include <Eigen/Geometry>

using namespace std;
using namespace Eigen;

int main(int argc, char** argv) {
  // 创建两个旋转四元数 q1 和 q2,表示两个刚体的旋转
  Quaterniond q1(0.35, 0.2, 0.3, 0.1), q2(-0.5, 0.4, -0.1, 0.2);
  
  // 归一化旋转四元数,确保表示合法的旋转
  q1.normalize();
  q2.normalize();
  
  // 创建两个平移向量 t1 和 t2,表示两个刚体的平移
  Vector3d t1(0.3, 0.1, 0.1), t2(-0.1, 0.5, 0.3);
  
  // 创建一个点 p1,表示在初始坐标系中的一个点
  Vector3d p1(0.5, 0, 0.2);

  // 创建两个欧氏变换矩阵 T1w 和 T2w,表示初始坐标系到两个刚体的变换
  Isometry3d T1w(q1), T2w(q2);
  
  // 将平移向量 t1 和 t2 分别添加到变换矩阵 T1w 和 T2w 中
  T1w.pretranslate(t1);
  T2w.pretranslate(t2);

  // 计算新的坐标 p2,在第二个刚体的坐标系中的坐标
  Vector3d p2 = T2w * T1w.inverse() * p1;

  // 输出变换后的坐标 p2
  cout << "Transformed Point p2: " << p2.transpose() << endl;

  return 0;
}

37.eigen的数据类型

在这里插入图片描述

38.eigen的block()函数

在这里插入图片描述

39.eigen中的.col()和.row()方法

在这里插入图片描述

40.eigen的点乘和叉乘.dot()和.cross()

在这里插入图片描述

41.元素乘积.prod()——即向量中所有元素的乘积

在这里插入图片描述

42.元素均值.mean()

在这里插入图片描述

43.查找向量或矩阵中的最小值和最大值minCoeff()和maxCoeff()

在这里插入图片描述

44.生成随机矩阵random()

在这里插入图片描述

45.用于处理数组(元素级操作)的数据结构Array类

在这里插入图片描述
在这里插入图片描述

46.eigen中Array类的常见操作

在这里插入图片描述

代码

// 逐元素操作Vectorized operations on each element independently  
// Eigen                       // Matlab        //注释  
R = P.cwiseProduct(Q);         // R = P .* Q    //逐元素乘法  
R = P.array() * s.array();     // R = P .* s    //逐元素乘法(s为标量)  
R = P.cwiseQuotient(Q);        // R = P ./ Q    //逐元素除法  
R = P.array() / Q.array();     // R = P ./ Q    //逐元素除法  
R = P.array() + s.array();     // R = P + s     //逐元素加法(s为标量)  
R = P.array() - s.array();     // R = P - s     //逐元素减法(s为标量)  
R.array() += s;                // R = R + s     //逐元素加法(s为标量)  
R.array() -= s;                // R = R - s     //逐元素减法(s为标量)  
R.array() < Q.array();         // R < Q         //逐元素比较运算  
R.array() <= Q.array();        // R <= Q        //逐元素比较运算  
R.cwiseInverse();              // 1 ./ P        //逐元素取倒数  
R.array().inverse();           // 1 ./ P        //逐元素取倒数  
R.array().sin()                // sin(P)        //逐元素计算正弦函数  
R.array().cos()                // cos(P)        //逐元素计算余弦函数  
R.array().pow(s)               // P .^ s        //逐元素计算幂函数  
R.array().square()             // P .^ 2        //逐元素计算平方  
R.array().cube()               // P .^ 3        //逐元素计算立方  
R.cwiseSqrt()                  // sqrt(P)       //逐元素计算平方根  
R.array().sqrt()               // sqrt(P)       //逐元素计算平方根  
R.array().exp()                // exp(P)        //逐元素计算指数函数  
R.array().log()                // log(P)        //逐元素计算对数函数  
R.cwiseMax(P)                  // max(R, P)     //逐元素计算R和P的最大值  
R.array().max(P.array())       // max(R, P)     //逐元素计算R和P的最大值  
R.cwiseMin(P)                  // min(R, P)     //逐元素计算R和P的最小值  
R.array().min(P.array())       // min(R, P)     //逐元素计算R和P的最小值  
R.cwiseAbs(P)                   // abs(P)        //逐元素计算R和P的绝对值  
R.array().abs()                // abs(P)        //逐元素计算绝对值  
R.cwiseAbs2()                  // abs(P.^2)     //逐元素计算平方  
R.array().abs2()               // abs(P.^2)     //逐元素计算平方  
(R.array() < s).select(P,Q);  // (R < s ? P : Q)         //根据R的元素值是否小于s,选择P和Q的对应元素  
R = (Q.array()==0).select(P,A) // R(Q==0) = P(Q==0) R(Q!=0) = P(Q!=0)      //根据Q中元素等于零的位置选择P中元素  
R = P.unaryExpr(ptr_fun(func)) // R = arrayfun(func, P)     // 对P中的每个元素应用func函数  

参考链接:一文学会Eigen库

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

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

相关文章

代驾小程序怎么做

代驾小程序是一款专门为用户提供代驾服务的手机应用程序。它具有以下功能&#xff1a; 1. 预约代驾&#xff1a;代驾小程序允许用户在需要代驾服务时提前进行预约。用户可以选择出发地点、目的地以及预计用车时间&#xff0c;系统会自动匹配最合适的代驾司机&#xff0c;并确保…

构建之法 - 软件工程实践教学:一线教师的13问

福州大学单红老师的软工课程总结 2020春&#xff0c;不一样的学期不一样的软工实践 单红⽼师在总结中&#xff0c;提出了13条疑惑&#xff0c;《构建之法》的作者邹欣⽼师就单红⽼师提出的每⼀条疑惑&#xff0c;给出了⾃⼰的思考&#xff0c;与他进⾏探讨交流。欢迎你也来参与…

ThinkPHP8命名规范-ThinkPHP8知识详解

本文主要讲解thinkphp8的命名规范&#xff0c;主要包括&#xff1a;遵循PHP自身的PSR-2命名规范和PSR-4自动加载规范、目录和文件命名规范、函数和类、属性命名规范、常量和配置命名规范、数据表和字段命名规范、不能使用PHP保留字。 在使用thinkphp8开发项目之前&#xff0c;…

pyspark笔记 pyspark.sql.functions

col qqpyspark 笔记 pyspark.sql.function col VS select_UQI-LIUWJ的博客-CSDN博客 取某一列 lit 创建一个包含指定值的列 date_trunc 将日期截取成由第一个参数指定的字符串值 year, yyyy, yy——截取到年month,mon,mm——截取到月day,dd ——截取到天microsecondmillis…

学习左耳听风栏目90天——第六天 6/90(学习左耳朵耗子的工匠精神,对技术的热爱)【如何拥有技术领导力】

学习左耳听风栏目90天——第六天 6/90&#xff08;学习左耳朵耗子的工匠精神&#xff0c;对技术的热爱&#xff09;【如何拥有技术领导力】

项目介绍:《WeTalk》网页聊天室 — Spring Boot、MyBatis、MySQL和WebSocket的奇妙融合

目录 引言&#xff1a; 前言&#xff1a; 技术栈&#xff1a; 主要功能&#xff1a; 功能详解&#xff1a; 1. 用户注册与登录&#xff1a; 2. 添加好友 3. 实时聊天 4. 消息未读 5. 删除聊天记录 6. 删除好友 未来展望&#xff1a; 项目地址&#xff1a; 结语&am…

预测算法|改进粒子群算法优化极限学习机IDM-PSO-ELM

回归拟合&#xff1a; 分类 本文是作者的预测算法系列的第四篇&#xff0c;前面的文章中介绍了BP、SVM、RF及其优化&#xff0c;感兴趣的读者可以在作者往期文章中了解&#xff0c;这一篇将介绍——极限学习机 过去的几十年里基于梯度的学习方法被广泛用于训练神经网络&am…

[gdc]Rendering ‘God of War Ragnark‘

gdc23&#xff0c; sony santa monica关于god of war的分享&#xff1b; back ground 作者stephen mcauley现在是santa monica的technical director&#xff1b;20年加入santa monica&#xff0c;作为rendering lead&#xff0c;有9年的经验&#xff0c;之前在ubisoft montre…

zookeeperAPI操作与写数据原理

要执行API操作需要在idea中创建maven项目 &#xff08;改成自己的阿里仓库&#xff09;导入特定依赖 添加日志文件 上边操作做成后就可以进行一些API的实现了 目录 导入maven依赖&#xff1a; 创建日志文件&#xff1a; 创建API客户端&#xff1a; &#xff08;1&#xff09…

【uniapp】uniapp自动导入自定义组件和设置分包:

文章目录 一、自动导入自定义组件&#xff1a;二、设置分包和预加载&#xff1a; 一、自动导入自定义组件&#xff1a; 【Volar 官网】https://github.com/vuejs/language-tools 二、设置分包和预加载&#xff1a; 【官方文档】https://uniapp.dcloud.net.cn/collocation…

android开发之Android 自定义滑动解锁View

自定义滑动解锁View 需求如下&#xff1a; 近期需要做一个类似屏幕滑动解锁的功能&#xff0c;右划开始&#xff0c;左划暂停。 需求效果图如下 实现效果展示 自定义view如下 /** Desc 自定义滑动解锁View Author ZY Mail sunnyfor98gmail.com Date 2021/5/17 11:52 *…

开发工具Eclipse的使用之导入项目(import)

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于Eclipse使用的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.导读 二.详细操作步骤 1.右击项…

【深度学习】StyleGANv2 2019 论文,Analyzing and Improving the Image Quality of StyleGAN

StyleGAN论文&#xff1a; 《A Style-Based Generator Architecture for Generative Adversarial Networks》 论文&#xff1a;https://arxiv.org/abs/1812.04948 代码&#xff1a; https://github.com/NVlabs/stylegan StyleGANv2论文&#xff1a; 《Analyzing and Improving …

电池的正极是带正电?

首先说明结论&#xff1a;电池正极带正电&#xff0c;负极带负电。 一个错误的实例&#xff1a; 如果说电流是从电池正极流动到电池负极&#xff0c;那么电子就是从负极流动到正极&#xff0c;那么正极就是带负电。----这个说法是错误的。这是因为&#xff0c;根据那么很出名…

简绘ChatGPT支持Midjourney绘图 支持stable diffusion绘图

简绘支持Midjourney绘图和stable diffusion绘图。 这意味着简绘具备Midjourney绘图和stable diffusion绘图功能的支持。

无涯教程-Perl - redo函数

描述 此函数将重新启动当前循环,而不会强制判断控制语句。块中不再执行任何语句。如果存在继续块,将不会执行。如果指定了LABEL,则在LABEL标识的循环开始时重新开始执行。 语法 以下是此函数的简单语法- redo LABELredo返回值 此函数不返回任何值。 例 以下是显示其基本…

Shell编程之条件测试、if语句、case语句

条件语句 一、条件测试1.1 测试命令1.1 文件测试1.2 整数比较1.3 字符串比较1.4 逻辑测试1.4.1 逻辑与 &&1.4.2 逻辑或 || 1.4.3 组合应用1.5 多个命令组合执行 ( ) { } 二、if语句2.1单分支结构2.2 多分支结构2.4 if语句练习2.4.1 单分支2.4.2 简单的交互式分数反馈 三…

元宇宙核能发电VR模拟仿真实训教学为建设新型电力系统提供重要支撑

随着“碳达峰、碳中和”目标与建设新型能源体系的提出&#xff0c;在元宇宙环境下建设电力系统是未来发展的趋势。以物联网、区块链、数字孪生、混合现实等技术为主要代表的元宇宙技术体系及其在电力和能源系统中的应用&#xff0c;将会促进智能电网的发展&#xff0c;为建设新…

VR安全宣传系列:防触电虚拟现实体验

在电气工作中&#xff0c;安全问题始终是重中之重。为了更好地提高公众的电气安全意识和技能&#xff0c;广州华锐互动开发了一种基于虚拟现实技术的模拟系统——VR防触电虚拟体验系统。这种系统可以模拟各种因操作不当导致的触电事故场景&#xff0c;并提供沉浸式的体验&#…

利用OpenSSL实现私有 CA 搭建和证书颁发

利用OpenSSL实现私有 CA 搭建和证书颁发 一、私有 CA 搭建1. 安装openssl2. 配置 openssl3. 生成 CA 自己的私钥4. 生成 CA 自己的自签证书5. 验证自签证书 二、向私有CA申请证书流程1. 生成应用私钥文件2. 根据应用私钥生成证书申请文件3. 向CA请求颁发证书4. 验证应用证书5. …