Eigen入门之密集矩阵 10 - 矩阵的行优先及列优先存储
简介
本篇介绍Eigen中矩阵及二维数组的系数存储顺序–行优先及列优先,已经如何指定优先顺序。
行优先(row-majoe)、 列优先(column-majoe)
矩阵的系数条目组成了一个二维的结构,在内存内存储矩阵时,必须以某种结构来布局。Eigen内提供了2中布局方式: 行优先、列优先。
如有矩阵A,如下:
A=[822991443545]A = \begin{bmatrix} 8 & 2 & 2 & 9 \\ 9 & 1 & 4 & 4 \\ 3 & 5 & 4 & 5 \end{bmatrix} A=⎣⎡893215244945⎦⎤
那么,以行优先存储时,其系数一行一行地,按照行顺序。其系数在内存中的顺序如此:
8 2 2 9 9 1 4 4 3 5 4 5
。
而以列优先的情况下,其系数的顺序则如此:
8 9 3 2 1 5 2 4 4 9 4 5
请看一下,并理解下面的示例,其使用PlainObjectBase::data()
的data()
函数,来得到矩阵保存于内存中的数据指针。
Matrix<int, 3, 4, ColMajor> Acolmajor;
Acolmajor << 8, 2, 2, 9,9, 1, 4, 4,3, 5, 4, 5;cout << "The matrix A:" << endl;
cout << Acolmajor << endl << endl; cout << "In memory (column-major):" << endl;
for (int i = 0; i < Acolmajor.size(); i++)cout << *(Acolmajor.data() + i) << " ";cout << endl << endl;Matrix<int, 3, 4, RowMajor> Arowmajor = Acolmajor;
cout << "In memory (row-major):" << endl;for (int i = 0; i < Arowmajor.size(); i++)cout << *(Arowmajor.data() + i) << " ";
cout << endl;
执行的结果:
The matrix A:
8 2 2 9
9 1 4 4
3 5 4 5In memory (column-major):
8 9 3 2 1 5 2 4 4 9 4 5 In memory (row-major):
8 2 2 9 9 1 4 4 3 5
Eigen中的存储方式
一个矩阵或一个二维数组可以通过指定的模板参数选项来设置矩阵和数组的存储模式/方式。就如矩阵类的说明所说,矩阵类模板有6个模板参数,其中三个是强制性的(标量,RowsAtCompileTime和ColsAtCompileTime),另外三是可选的(Options选项,MaxRowsAtCompileTime和MaxColsAtCompileTime)。如果选项参数设置为RowMajor,那么矩阵或数组存储采样行优先顺序;如果设置为ColMajor,然后存储在列为主的顺序。
这种机制就用于为程序指定的矩阵的存储顺序。如果没有指定存储顺序,那么就默认存储条目采样列优先column-major
。Eigen内定义的简化的typedef (Matrix3f ArrayXXd,等等)也是如此。
一个使用某种存储顺序的矩阵/数组可以使用赋值表达式,赋值给使用其他存储顺序矩阵/数组,如上面的示例的程序,在 Arowmajor初始化时,使用Acolmajor为其赋值。Eigen将自动重新排序所有的系数。更普遍的是,行和列为主的矩阵可以混合使用在一个表达式内。
选择哪种存储模式?
在程序中,选择哪种存储模式,这依赖于我们自己的程序。
- 如果你的程序还使用了其他的开发库,而不是只有Eigen。我们需要考虑相互之间的匹配的问题。这时,我们在程序中使用统一的存储顺序,程序会更容易、更快地开发。
- 如果算法要以行的方式操作,则程序采样行优先模式,会带来更好地性能。同样,采样列优先的模式,在需要访问列的时候更适合。
- Eigen缺省地采样列优先模式。自然地,大多数的开发和测试使用了列为主的矩阵。
Eigen入门之密集矩阵 10 - 矩阵的行优先及列优先存储相关推荐
- Eigen入门之密集矩阵 8 - resharp slicing切片
简介 Eigen还没有提供resharp或者slicing的处理函数,但是,可以使用Map 类来实现这些功能. 实现resharp 操作Resharp及修改Matrix的维度大小,而其系数保持不变.R ...
- 矩阵基础 (1). 行优先和列优先的问题
原 矩阵基础 (1). 行优先和列优先的问题 2016年08月18日 18:37:00 林微 阅读数:7351 </div><div class="operating&qu ...
- 矩阵中 “行优先“ 和 “列“ 优先
什么是行优先和列优先? 故名思意,当我们表示一个矩阵的时候把行放在前面就是行优先,把列放在前面就是列优先. 比如 一个矩阵[m][n] , 表示为 m行n列矩阵,表示为行优先,当表示为 m 列n行的时 ...
- Eigen入门之密集矩阵 5 - 再谈Matrix初始化
简介 这里将讨论一下高级些的矩阵初始化方法. comma-initializer 逗号初始化器 comma-initializer方法很简单,可以一下把矩阵/向量的系数全部设置完.语法很简单,使用逗号 ...
- Eigen入门之密集矩阵 2-- Matrix及Vector的计算方法
简介 Eigen内的Matrix和Vector提供了类似C++的运算符,如+,-,*:也提供了编程的函数方法,如点乘和叉乘的dot(), cross(),如此等等. 在Eigen的Matrix类,代表 ...
- Eigen入门之密集矩阵 9 - 别名混乱Aliasing
简介 别名混乱Aliasing是指在赋值表达式中,一个Eigen对象(矩阵.数组.向量)同时出现在左值和右值表达式中,比如v = v*2; m = m.transpose();; 别名混乱会引起错误, ...
- Eigen入门之密集矩阵 1 -- 类Matrix介绍
简介 本篇介绍Eigen中的Matrix类.在Eigen中,矩阵和向量的类型都用Matrix来表示.向量是一种特殊的矩阵,其只有一行或者一列. Matrix构造 在Matrix.h中,定义了Matri ...
- Eigen入门之密集矩阵 7 - Map class:连接Eigen与C++的数据
简介 本文介绍一下Dense Matrix如何与c/C++的数组进行交互操作,这在引入其他的库中的vector向量和矩阵到Eigen中时要使用到的技术. 有时,你有一些定义好的数据,可能是数组,你需要 ...
- Eigen入门之密集矩阵 6 - Reductions, visitors and broadcasting
简介 本文介绍一下Dense Matrix的3中操作: reduction, visitor, broadcasting. 归约计算reduction. Eigen的归约计算是这样的一类计算,它是对矩 ...
最新文章
- Hadoop2.7.6在Windows7单机部署
- 天线增益英文名称:antenna gain
- 为什么很多人只提苹果手机比安卓手机流畅耐用,却不提苹果手机比安卓手机贵几倍?
- X协议 mysql_MySQL X协议分析
- java 使用不同目录下的类_如何运行在不同目录下的java类文件? - Break易站
- STM8S003F3 PWM的使用
- 减速器课程设计指导系统使用方法
- 【java】信号量机制
- 深度学习mindspore --- rescale(rescale, shift)
- 岁月的感知,生命的守望
- 贝尔曼最优方程(Bellman Optimality Equation)
- 自用-jupyter启动和快捷键
- ORACLE数据库练习题整理(2)
- Fluent的融化凝固模型介绍
- [200902] 条件概率与独立事件
- np.savetxt保存时数据不使用科学计数法形式
- 关于ros提到的那只turtle
- PYQT5-实时更新图片显示
- switchresx卸载_SwitchResX for Mac使用过程启动问题解答
- Hadoop数据库性能调优指南
热门文章
- 使用百度API进行关键点识别
- Python爬虫实战之(五)| 模拟登录wechat 1
- MySQL笔记之视图的使用详解
- thymeleaf 学习笔记-基础篇(中文教程)
- 数据持久化------Archiving(归档,解档)
- LoadRunner变量到参数的互换
- silverlight5
- 深入理解及配置ISA Server 2006访问规则
- java 调用一个抛出异常的函数,Java VS C++(14) 调用可能抛出异常的函数
- MS SQL Server中的CONVERT日期格式化大全