IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> Eigen学习(一) -> 正文阅读

[C++知识库]Eigen学习(一)

第一章总结:

1.关于使用fixed-size 和 dynamic-size
MatrixXd相当于动态开辟一片内存,类似于 new
Matrix3d 在编译时已经分配好内存
原则>4的矩阵用dynamic-size <= 4用fixed-size
2. transpose和adjoint会简单的返回一个代理对象并不对本省做转置。如果执行 b=a.transpose() ,a不变,转置结果被赋值给b。如果执行 a=a.transpose() Eigen在转置结束之前结果会开始写入a,所以a的最终结果不一定等于a的转置。这被称为“别名问题”。
3. 但是矩阵相乘不会有别名问题,m=mm是可以的,因为eigin内部做了特殊处理引入临时变量 tmp=mm m = tmp, 如果想要避免临时变量 c.noalias() += a*b
4. 当相同的矩阵或array在等式左右都出现时,很容易出现混淆。
compnent级别的操作不用考虑混淆。(组件级是指整体的操作,比如matrix加法、scalar乘、array乘等,这类操作是安全的,不会出现混淆。)
矩阵相乘,Eigen默认会解决混淆问题,如果你确定不会出现混淆,可以使用noalias()来提效。
混淆出现时,可以用eval()和xxxInPlace()函数解决。
混淆(别名问题),比如

MatrixXi mat(3,3); 
mat << 1, 2, 3,   4, 5, 6,   7, 8, 9;
mat.bottomRightCorner(2,2) = mat.topLeftCorner(2,2);
cout << "After the assignment mat:\n" << mat << endl;
// The eval() solves the aliasing problem
mat.bottomRightCorner(2,2) = mat.topLeftCorner(2,2).eval(); //通过这个可以解决
cout << "After the assignment, mat = \n" << mat << endl;


\\结果
After the assignment, mat = 
1 2 3
4 1 2
7 4 1

After the assignment, mat = 
1 2 3
4 1 2
7 4 5
  1. Map类,实现用一片内存生成Matrix, Map mf(pf,rows,columns); pf是一个数组指针float * 定义一个MatrixXf 里面的数字是pf指向的内存里面的数据。类似于opencv 的 Mat 其中用内存指针生成Mat
  2. 存储是默认列优先存储。
  3. eigin在编译时会使用表达式变量,比如a = 3b + 4c 会提前给出a(0) = 3b(0) + 4c(0)表达式,计算时直接代入变量计算即可。类似于以前我们用matlab提前把公式用表达式表示。所以不用担心复杂公式的计算效率。

还有一个对齐问题。如果采用c++17 就不会有这个问题。

第二章总结 稠密线性矩阵

Ax = b 第二章就是讲解如何对A分解,求出x。有很多种分解方式,QR, SVD,LU等,不同的分解方式精度和效率不同。
具体参见官网。

  1. 最小二乘Ax-b可直接使用SVD分解得到
  2. 就地分解 从3.3开始, 可以直接在矩阵的内存里面对矩阵分解,这对于大型矩阵是非常友好的,可以节约内存
  3. 矩阵不同的分解的速度 官网提供。(我们还可以利用它提供例子自己针对自己的硬件测试)

第三章总结 稀疏线性矩阵

  1. SparseMatrix<>模板类是用于表示稀疏矩阵,注意稠密的用的是Matrix<>
    SparseMatrix<>提供了高性能和低内存使用率
    // 1. Values: 存储非零的系数值。注意,压缩列存储按照一列一列的顺序存储非零元素,同样,压缩行按照一行一行的顺序存储元素;
    // 2. InnerIndices: 存储非零的行(或列)下标。简单的说,我们可以先按照列或者行的顺序存储values,然后对于values中的每一个元素,确定其所在的行or列的下标;
    // 3. OuterStarts: 为每列(分别为行)存储前两个数组中第一个非零的索引。注意,这个数组存储的Values和InnerIndices中的位置;
    // 4. InnerNNZs:存储每列(分别为行)的非零元素个数。
    // 注意:术语inner指的是内部向量,该向量是列主矩阵的列,或行主矩阵的行。
    // 术语outer是指另一个方向,即行or列;

第四章总结 几何模块(主要是给空间转换使用)

Transform类 基本上我们用到的二维、三维旋转、平移 Eigen 都定义ok了。比如Affine3d Isometry3d 需要使用就查看geometry.

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-11-27 09:43:57  更:2021-11-27 09:45:48 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 9:25:17-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码