Eigen初始化及基本操作大全

2023-05-16

    Eigen常用操作

 
Eigen3安装: ubuntu如何安装Eigen
 

include_directories (/usr/include/Eigen/)

这篇博客主要内容有:

  1. Eigen常用头文件
  2. Eigen矩阵和向量的基本定义与初始化
  3. 高级初始化
      - 行向量RowVectorXd
      - 块赋值
  4. 基本运算函数
  5. 常用块操作
  6. 计算特征值和特征向量
  7. Array类, ArrayXf , ArrayXXf
  8. 解线性最小二乘
      - 齐次 min||Mx||,分不带约束和带约束条件
      - 非齐次 min||Mx + b||,分不带约束和带约束添加
     

1. 常用头文件

#include <Eigen/Dense> //包含了下面的Core/Geometry/LU/Cholesky/SVD/QR/Eigenvalues模块
#include <Eigen/Core> // 包含Matrix和Array类,基础的线性代数运算和数组操作
#include <Eigen/LU> // 包含求逆,行列式,LU分解
#include <Eigen/Geometry> //包含旋转,平移,缩放,2维和3维的各种变换。
#include <Eigen/Cholesky> //包含LLT和LDLT Cholesky分解
#include <Eigen/SVD> //包含SVD分解
#include <Eigen/QR> //包含QR分解
#include <Eigen/Eigenvalues> //包含特征值,特征向量分解

#include <Eigen/Sparse> //包含稀疏矩阵的存储和运算

#include <Eigen/Eigen> //包含Dense和Sparse

2. 基本定义及初始化

Eigen::Matrix<double,2,2> m;
m << 1,2,3,4;

Eigen::MatrixXf m1(2,3);
m1 << 1,2,3,
	  4,5,6;

Eigen::Matrix3d m2 = Eigen::Matrix3d::Identity();//Eigen::Matrix3d::Zero();

Eigen::Matrix3d m3 = Eigen::Matrix3d::Random(); //随机初始化

Eigen::Vector3f v1 = Eigen::Vector3f::Zero();

Eigen::Vector3d v2(1.0, 2.0, 3.0);

Eigen::VectorXf v3(20); //维度为20的向量,未初始化.
v3 << 1.0 , 2.0 , 3.0;

cout << m1(1,1) << endl;
cout << v1(1) << endl;

3. 高级初始化

//1. Eigen::RowVectorXd //行向量,之前的Vector都是列向量
using namespace Eigen;
RowVectorXd rv1(1,2,3);
RowVectorXd rv2(4);
rv2 << 1,2,3,4;
RowVectorXd joined_rv12(7);
joined_rv12 << rv1 , rv2;//rv1后接rv2
//joined_rv12 is:
1 2 3 1 2 3 4;

//2. 块操作
MatrixXf m4(2,2);
m4 << 1,2,3,4;
MatrixXf m5(4,4);
m5 << m4, m4 / 10, m4 * 10, m4;//将m5分了四块赋值
//m5 is :
1  2  0.1 0.2 
3  4  0.3 0.4
10 20  1   2
30 40  3   4

Matrix3f m6;
m6.row(0) << 1,2,3;
m6.block(1,0,2,2) << 4,5,6,7; //
//m6.block<2,2>(1,0) << 4,5,6,7;
m6.col(2).tail(2) << 6,9;
//m6 is: 
1 2 3
4 5 6
6 7 9

3. 基本运算函数

MatrixXf m7 = MatrixXf::Random(3,3);
m7.row(i);//矩阵第i行
m7.col(j);//矩阵第j列
m7.transpose();
m7.conjugate();//共轭
m7.adjoint(); //共轭转置
m7.minCoeff();//所有元素中最小元素
m7.maxCoeff();//所有元素中最大元素
m7.trace();//迹,对角元素的和
m7.sum(); //所有元素求和
m7.prod(); //所有元素求积
m7.mean(); //所有元素求平均

Vector3f v4(4,5,6);
Vector3f v5(7,8,9);
v4.dot(v5); //点乘
v4.cross(v5);//叉乘

/** 矩阵的+、-、数×、乘法
左右两侧变量具有相同的尺寸(行和列),并且元素类型相同(Eigen不自动转化类型),
其运算和int,float等基本类型相同。*/
Vector3f v6 = m7 * v5;
Matrix3f m_sum = m6 + m7;
Matrix3f m_dec = m6 - m7;
Matrix3f m_prod = 2.5 * m7;
Matrix3f m_prod2 = m6 * m7;
Matrix3d m_dev = m7 / 2.0;

4. 常用块操作

MatrixXd m8 = MatrixXd::Random(3,3);

//① 行列
m8.row(i);
m8.col(j);

//② block<>()
Matrix<double,p,q> m9 = m8.block(i,j,p,q);//起点(i, j),块大小(p, q),构建一个动态尺寸的block
m8.block<p,q>(i,j);

③ Matrix其他块操作
Matrix块操作
④ Vector块操作
Vector块操作
注: ③ ④中的图,引用了大佬的博客:Eigen库使用指南
 

5.计算特征值和特征向量

Eigen::MatrixXd m9 = Eigen::MatrixXd::Random(3,3);
Eigen::MatrixXd mTm = m9.transpose() * m9;

Eigen::SelfAdjointEigenSolver<Eigen::MatrixXd> eigen_solver(mTm);
Eigen::VectorXd eigenvalues = eigen_solver.eigenvalues();
Eigen::MatrixXd eigenvectors = eigen_solver.eigenvectors();
Eigen::VectorXd v0 = eigenvectors.col(0);// 因为特征值一般按从小到大排列,所以col(0)就是最小特征值对应的特征向量

6. Array类

 Eigen中的Array类,定义了许多Matrix和Vector类没有的运算,比如矩阵和标量的加减运算,Array和Matrix之间也容易相互转换.

6.1 Array的初始化和访问

//定义
typedef Array<float ,Dynamic,1>  ArrayXf;
typedef Array<float,3,1>         Array3f;
typedef Array<double,Dynamic ,Dynamic > ArrayXXd;
typedef Array<double ,3,3 >    Array33d;

//初始化   没有Eigen::Array33f::Identity();
Eigen::Array33f a1 = Eigen::Array33f::Zero();
Eigen::ArrayXf a2 = Eigen::ArrayXf::Zero(3);
Eigen::ArrayXXf a3 = Eigen::ArrayXXf::Zero(3,4);
Eigen::Array33f a3 = Eigen::ArrayXXf::Zero();

Eigen::ArrayXXf a4(2,2);
a4 << 1,2,3,4;

//访问
cout << a4(0,0) << endl;

6.2 Array高级初始化

ArrayXXf a5(10, 4);
a5.col(0) = ArrayXf::LinSpaced(10, 0, 90);//间隔10,从0到90赋值
a5.col(1) = M_PI / 180 * a5.col(0);
a5.col(2) = a5.col(1).sin();//对a5的第一列,用sin()求值后赋值给a5.col(2)对应每一个位置
a5.col(3) = a5.col(1).cos();//求cos
std::cout << " Degrees Radians Sine Cosine\n";
std::cout << a5 << std::endl;

输出为:

//output
Degrees Radians Sine Cosine
           0            0            0            1
          10     0.174533     0.173648     0.984808
          20     0.349066      0.34202     0.939693
          30     0.523599          0.5     0.866025
          40     0.698132     0.642788     0.766044
          50     0.872665     0.766044     0.642788
          60       1.0472     0.866025          0.5
          70      1.22173     0.939693      0.34202
          80      1.39626     0.984808     0.173648
          90       1.5708            1      -4.37114e-08

参考博客地址: eigen中高级初始化
 

7. 解线性最小二乘方程

7.1 齐次线性最小二乘 min||Mx||,M是4 * 4矩阵

(1) 无约束条件: m i n ∣ ∣ M x ∣ ∣ min||Mx|| minMx
 - 理论上:取MTM的最小特征值对应的特征向量作为x的解;
 - 工程上:对M做svd分解, M = U Σ V T M = U{\Sigma}V^T M=UΣVT,取最小奇异值对应的V的列向量作为x的解(实际上,奇异值一般按由大到小排列,V的最后一列就是解),证明:证明AX=0的最小二乘解是ATA最小特征值对应的特征向量
 - 求解方法有两种:特征向量分解 和 svd分解
 
  - 注意,对于MX = 0的问题,做分解的时候,一般会变成 M T M X = 0 M^TMX = 0 MTMX=0.
  - 注意,要先判别矩阵的病态性,如果条件数太大,表示病态严重,则结果精度很低

//1. 特征值和特征向量分解
Eigen::JacobiSVD<Eigen::MatrixXd> svd(MTM);
//条件数等于最小的奇异值除以最小的奇异值
double cond = svd.singularValues()(0) / svd.singularValues()(svd.singularValues().size() - 1);
if (cond > max_cond_number)//max_cond_number: 自己设置的条件数阈值,我设置的是75
{
  std::cout << colouredString("Matrix A is almost singular.", RED, BOLD) << std::endl;
  return 0;
}
  
Eigen::SelfAdjointEigenSolver<Eigen::MatrixXd> eigen_solver(MTM);
Eigen::VectorXd eigenvalues = eigen_solver.eigenvalues();
Eigen::MatrixXd eigenvectors = eigen_solver.eigenvectors();
Eigen::VectorXd X = eigenvectors.col(0);// 因为特征值一般按从小到大排列,所以col(0)就是最小特征值对应的特征向量

//2. svd分解
Eigen::JacobiSVD<Eigen::MatrixXd> svd(MTM, Eigen::ComputeFullU |Eigen::ComputeFullV);
//Eigen::VectorXd singular_values = svd.singularValues();
//Eigen::MatrixXd singular_matrix = svd.matrixV();
Eigen::Vector3d X = svd.matrixV().block<4,1>(0,3);// 因为奇异值一般按从大到小排列,所以,最后一列就是最小奇异值对应的向量.

(2) 带约束条件: m i n ∣ ∣ M X ∣ ∣ , X [ 0 ] ∗ X [ 3 ] = X [ 1 ] ∗ X [ 2 ] , ∣ ∣ X ∣ ∣ = 1 min||MX|| , X[0]*X[3] = X[1]*X[2], ||X|| = 1 minMX,X[0]X[3]=X[1]X[2],X=1;
  - 有n约束,就取最小的n个列向量,乘以n个系数,然后用n个约束去求解n个系数,就是方程的最小二乘解.
     X = a ∗ V 1 + b ∗ V 2 X = a*V_1 + b*V_2 X=aV1+bV2

Eigen::JacobiSVD<Eigen::MatrixXd> svd(MTM, Eigen::ComputeFullU |Eigen::ComputeFullV);
Eigen::Vector3d V1 = svd.matrixV().block<4,1>(0,3);
Eigen::Vector3d V2 = svd.matrixV().block<4,1>(0,2);
//再求a 和 b, X = a*V1 + b*V2

7.2 非齐次线性最小二乘 min||Mx - b||

(1) 不带约束条件
  - 采用奇异值分解;
  - 注意,要先判别矩阵的病态性,如果条件数太大,表示病态严重,则结果精度很低

  Eigen::JacobiSVD<Eigen::MatrixXd> svd(M);
  double cond = svd.singularValues()(0) / svd.singularValues()(svd.singularValues().size() - 1);
  //std::cout << "cond "  << cond << std::endl;
  if (cond > max_cond_number)//max_cond_number: 自己设置的条件数阈值,我设置的是75
  {
    std::cout << colouredString("Matrix A is almost singular.", RED, BOLD) << std::endl;
    return 0;
  }

  Eigen::VectorXd X = Eigen::Vector2d::Zero();
  X = M.colPivHouseholderQr().solve(b);

  - 除了colPivHouseholderQr()分解,还有:
Eigen分解函数
 
(2) 带约束条件
  - 拉格朗日数乘法,请参考论文中的部分求解:Simultaneous Calibration of Odometry and Parameters for Mobile Robots
  - 采用非线性优化的方法(需要较好的初始值,需要合理的权重)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Eigen初始化及基本操作大全 的相关文章

  • 嵌入式C语言基础知识 -- 函数指针&回调函数&结构体指针

    目录 一 函数指针 xff1a 什么是函数指针 xff1f 函数指针的三种定义方式 xff1a xff08 1 xff09 先定义出函数的类型 xff0c 再通过类型定义函数指针变量 xff08 2 xff09 先定义出函数指针的类型 xf
  • 常见的SSL证书错误代码及解决方法

    有时候SSL证书明明安装了 xff0c 但是为什么不出现绿色小锁呢 xff1f 浏览器总是报错 xff0c SSL证书明明已经安装好了 xff0c 怎么突然访问不显示绿色安全锁呢 xff1f 针对这些问题 xff0c 整理出一些常见的SSL
  • Tomcat 8.5和Tomcat 9安装SSL证书的教程

    第一步 xff1a 准备好所需要的证书文件 xff0c Tomcat8 5和Tomcat9部署ssl证书一般使用JKS文件 xff0c 如果有Pem和key文件 xff0c 也需要合成JKS文件 第二步 xff1a 打开tomcat配置文件
  • 浅谈人工智能(AI)

    人工智能 AI 一 人工智能简介 1 1 人工智能定义和发展历史 人工智能 xff08 Artificial Intelligence xff09 xff0c 英文缩写为AI 它是研究 开发用于模拟 延伸和扩展人的智能的理论 方法 技术及应
  • 睿智的目标检测31——非极大抑制NMS与Soft-NMS

    注意事项 Soft NMS对于大多数数据集而言 xff0c 作用比较小 xff0c 提升效果非常不明显 xff0c 它起作用的地方是大量密集的同类重叠场景 xff0c 大量密集的不同类重叠场景其实也没什么作用 xff0c 同学们可以借助So
  • ubuntu18.04 安装Pangolin

    按照Github上面的教程走即可 xff0c 非常简单 https github com stevenlovegrove Pangolin 首先要安装一些必要的库 Glew xff1a sudo apt get install libgle
  • freertos 学习 资源整理

    1 freertos 官方网站 freertos 官方网站 https www freertos org index html 源码下载 xff1a https sourceforge net projects freertos 2 如何下
  • openwrt: ipq4019 路由 资料汇总

    参考网站 https openwrt org 代码 https github com openwrt openwrt releases tag v18 06 1 wget https github com openwrt openwrt a
  • IT行业ToB销售为什么这么难

    IT行业ToB销售为什么这么难 华东企业服务IT圈 4天前 背景 xff1a 笔者IT行业从业14年 xff0c 干过售后 售前 销售 创过业 xff0c 属于那种基本出去拜访客户不需要售前那种 xff0c 复杂的技术方案自己操刀才放心 x
  • 【Linux编程】守护进程(daemon)详解与创建

    本文主要参考自 xff1a linux系统编程之进程 xff08 八 xff09 xff1a 守护进程详解及创建 xff0c daemon 使用 一 概述 Daemon xff08 守护进程 xff09 是运行在后台的一种特殊进程 它独立于
  • Android studio svn使用方法

    步骤 一 设置忽略文件 可参考工程目录下的 gitignore文件 iml DS Store externalNativeBuild local properties idea libraries idea modules xml idea
  • linux lsusb命令的安装及简单使用

    在 Linux 中我们可以使用 lsusb 来列出 USB 设备和它的属性 xff0c lsusb 会显示驱动和内部连接到你系统的设备 直接在控制台输入 lsusb 即可 安装 如果无法运行 lsusb xff0c 使用以下命令安装 xff
  • 算法总结

    在2020年的时候 xff0c 我第一次接触了C 43 43 编程 xff0c 那时的我是一位四年级的小学生 xff0c 觉得挺好玩的 xff0c 爸爸就给我推荐了一门课程 程序设计与算法 xff08 一 xff09 C语言程序设计 xff
  • ubuntu16.04安装docker

    ubuntu16 04安装docker 开始安装 开始安装 由于apt官方库里的docker版本可能比较旧 xff0c 所以先卸载可能存在的旧版本 xff1a span class token function sudo span span
  • docker命令中的/bin/bash

    docker run i t tomcat bin bash 中的 bin bash的作用是因为docker后台必须运行一个进程 xff0c 否则容器就会退出 xff0c 在这里表示启动容器后启动bash
  • 如何将文件从本机上传到docker容器

    1 如何从docker容器中下载文件 xff1a docker span class token function cp span container created path span class token operator lt sp
  • libjpeg.so.8: cannot open shared object file: No such file or directory.

    在docker容器里执行carla的PythonAPI报错 xff1a libjpeg so 8 cannot span class token function open span shared object file No such s
  • Docker容器图形界面显示的配置方法

    参考博客 0 环境说明 Ubuntu 16 04 docker 19 03 12 因为要在docker中用pygame xff0c 要用到显示器 xff0c 这个时候需要解决这个Docker 可视化 的问题 原理简介 原理上可以把docke
  • 在docker中运行carla

    参考carla文档 ubuntu18 04 carla0 9 9 docker19 03 12 Docker Installation Docker CE For our tests we used the Docker CE versio
  • Pyglet设置窗口标题

    Pyglet教程 Caption The window s caption appears in its title bar and task bar icon on Windows and some Linux window manage

随机推荐

  • Linux 解决远程连接的 “Gtk-WARNING **: cannot open display;”

    转发 ssh Y username 64 ip 使用 Y 参数实际上是授权了 X11 转发 xff0c 这样就可以看到来自远端的 gtk 图形窗口了 span class token function man span span class
  • android jni调试 - 堆栈分析

    一 环境 xff1a windows rk3399 android 7 1 二 奔溃信息 pid 13544 tid 13639 name no localmeeting gt gt gt com sino localmeeting lt
  • CFileDialog的使用[转]

    由于项目需要 xff0c 查阅了一下CFileDialog类 xff0c 以满足程序自动读取配置文件的需求 xff0c 现在小小记录一下 xff01 CFileDialog类封装了Windows常用的文件对话框 xff0c 提供个一种简单的
  • 记录一下c/c++的几种计时方式

    include lt iostream gt include lt string gt include lt chrono gt void Run for int i 61 0 i lt 10000000 i 43 43 void time
  • [转载] 强化学习开源框架整理

    转载 https zhuanlan zhihu com p 582396276 本篇主要是介绍了不同的 RL 开源工作 xff0c 包括环境开源工作和算法开源工作 xff0c 同时关注这些开源工作对于多机多卡并行分布式训练的支持 算法框架
  • tf模型在C++部署

    tensorflow训练好的模型使用ONNX Runtime在C 43 43 部署 tf模型转onnx使用tf2onnx 在前面的文章有讲到c 43 43 调用tf keras的模型 环境 ubuntu20 04cuda 11 6cudnn
  • Google Breakpad 之一,跨平台crash 处理上报系统简介

    C C 43 43 程序最棘手的时候就是一个字 挂 xff0c 总是经常和不经常的挂掉 xff0c 尤其是那些线上的不经常挂的情况 xff0c 光看日志定位问题真的很难 为解决C挂挂的问题 xff0c 有必要提供一个跨平台的crash处理系
  • ubuntu14.04更换内核为3.14

    查看ubuntu14 04支持的内核版本的命令 xff1a atp cache showpkg linux headers 现在Ubuntu14 04安装完成后为4 4 0的内核 xff0c 若要降低内核版本 xff0c 操作方法如下 xf
  • 回首2013,这一年的坚持

    2013年 xff0c 眨眼间已悄悄流逝 这一年回味起来 xff0c 总是那么美 xff0c 充满快乐 xff0c 令人陶醉 一 生活篇 2013年对我来说 xff0c 是快乐的一年 在这一年里 xff0c 遇见了很多美丽的景色 xff0c
  • 使用Cropper进行图片剪裁上传

    在项目中 xff0c 需要多上传的图片按照比例和尺寸进行裁剪 xff0c 这类场景在一些CMS系统中是比较常见的 xff0c 尤其是大部分的文章现在要适配PC Mobile两种平台 xff0c 文章的封面图等便需要按照尺寸做裁剪 xff0c
  • Element-UI消息提示组件Message在Vuex中的调用实现

    在最近的项目开发中 xff0c 前端部分使用 Vue 开发 xff0c 整个页面基于 Element UI 实现 由于是单页面多组件应用 xff0c 使用了 Vuex 做状态管理 为了页面交互的友好和风格的统一 xff0c 消息提醒使用 E
  • Fork原项目新增分支的同步和推送

    在 Github 或者 Gitlab Fork 项目以后 xff0c 原项目增加了新的分支 xff0c 我们可以通过以下流程将分支同步下来 本项目前提假设我们设置了 remote 的名称为 up 与源项目关联 git remote v or
  • Elasticsearch文档版本冲突原理与解决

    一般我们在更新文档时 xff0c 主要的操作流程时 xff1a 读取文档 gt 修改 gt 提交保存 数据中心等保存的都是最新一次提交的内容 大部分时候 xff0c 这都没有什么问题 但是如果两个或更多的请求同时修改一个文档时 xff0c
  • Protobuf3 使用笔记

    一 和protobuf2比 xff0c 更新的内容 xff1a 1 字段前取消了required和optional两个关键字 xff0c 目前可用的只有repeated关键字 2 不可以现设置默认值了 a string默认为空串 b 枚举默
  • 随笔

    沟通 跨部门沟通 xff0c 首先应确立沟通的目的是双方的有效配合和问题解决的方向 方法 xff0c 去除程序员们自带的问题责任论 xff0c 不能按照 不是我的问题 xff0c 我这OK xff0c 跟我无关 这样的思路去讨论和解决问题
  • Linux内存消耗

    原文 xff1a https web archive org web 20120520221529 http emilics com blog article mconsumption html 本文主要描述如何通过一个合理的方法来测量li
  • Linux安装Docker完整详细教程

    目录 Docker及系统版本 Docker的自动化安装 Docker的手动安装 xff08 CentOS7 xff09 1 1 卸载历史版本的Docker 1 2 安装依赖包 1 3 更新本地镜像源 也可以叫做 xff1a 设置源仓库 1
  • 匿名飞控笔记(一)

    四轴飞行器的控制原理 四轴飞行器的结构 xff08 待补 xff09 四轴飞行器的运动控制方法 xff08 待补 xff09 四轴飞行器各部分工作原理 飞行姿态与升力关系 1 绕y轴旋转 角度 2 绕x轴旋转 角度 3 绕z轴旋转 角度 飞
  • 匿名飞控笔记(三)

    姿态解算 四元数表示方向余弦矩阵误差的求解PI误差补偿四元数的求解欧拉角的求解 以下参考 xff1a https blog csdn net zhiyu buliang article details 88936541 1 明确一个概念 x
  • Eigen初始化及基本操作大全

    Eigen常用操作 Eigen3安装 ubuntu如何安装Eigen include directories span class token punctuation span span class token operator span