Eigen中 Row-Major 和 Column-Major 存储顺序的区别

2024-06-18 20:52

本文主要是介绍Eigen中 Row-Major 和 Column-Major 存储顺序的区别,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Eigen中 Row-Major 和 Column-Major 存储顺序的区别

flyfish

Eigen::RowMajor 是 Eigen 库中用于指定矩阵存储顺序的一种选项

理解 Row-Major 和 Column-Major 存储顺序的区别,绘制一个单一的图来显示内存中的元素访问顺序,在图中用箭头表示访问顺序.

import numpy as np
import matplotlib.pyplot as plt# 创建一个4x4矩阵
matrix = np.arange(1, 17).reshape((4, 4))# 绘制存储布局函数
def plot_memory_layout(matrix, order, title):fig, ax = plt.subplots()ax.matshow(matrix, cmap='viridis')for (i, j), val in np.ndenumerate(matrix):ax.text(j, i, f'{val}', ha='center', va='center', color='white')# 添加箭头以显示存储顺序if order == 'C':# Row-Major Orderfor i in range(matrix.shape[0]):for j in range(matrix.shape[1] - 1):ax.arrow(j, i, 0.8, 0, head_width=0.3, head_length=0.2, fc='red', ec='red')if i < matrix.shape[0] - 1:ax.arrow(matrix.shape[1] - 1, i, 0, 0.8, head_width=0.3, head_length=0.2, fc='red', ec='red')elif order == 'F':# Column-Major Orderfor j in range(matrix.shape[1]):for i in range(matrix.shape[0] - 1):ax.arrow(j, i, 0, 0.8, head_width=0.3, head_length=0.2, fc='red', ec='red')if j < matrix.shape[1] - 1:ax.arrow(j, matrix.shape[0] - 1, 0.8, 0, head_width=0.3, head_length=0.2, fc='red', ec='red')plt.title(title)plt.show()# 绘制行主要顺序存储的矩阵
plot_memory_layout(matrix, 'C', 'Row-Major Storage Layout')# 绘制列主要顺序存储的矩阵
plot_memory_layout(matrix, 'F', 'Column-Major Storage Layout')

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

Eigen中的存储顺序

矩阵或二维数组的存储顺序可以通过为 Matrix 或 Array 指定 Options 模板参数来设置。如 Matrix 类所述,Matrix 类模板有六个模板参数,其中三个是必选参数(Scalar、RowsAtCompileTime 和 ColsAtCompileTime),三个是可选参数(Options、MaxRowsAtCompileTime 和 MaxColsAtCompileTime)。如果将 Options 参数设置为 RowMajor,则矩阵或数组按行主要顺序存储;如果将其设置为 ColMajor,则按列主要顺序存储。在上述 Eigen 程序中使用这种机制来指定存储顺序。

如果未指定存储顺序,则 Eigen 默认按列主要顺序存储条目。如果使用便利的类型定义(如 Matrix3f、ArrayXXd 等),也是如此。

使用一种存储顺序的矩阵和数组可以赋值给使用另一种存储顺序的矩阵和数组,就像在上述程序中使用 Acolmajor 初始化 Arowmajor 时那样。Eigen 将自动重新排列条目。更普遍地说,我们可以在表达式中混合使用行主要和列主要矩阵。

选择哪种存储顺序?

那么,在程序中应该使用哪种存储顺序呢?对此问题没有简单的答案,取决于您的应用程序。这里有一些需要记住的要点:

您的用户可能希望您使用特定的存储顺序。或者,您可能使用 Eigen 以外的其他库,而这些库可能需要特定的存储顺序。在这些情况下,在整个程序中使用这种存储顺序可能是最简单和最快的。
逐行遍历矩阵的算法在矩阵按行主要顺序存储时会更快,因为数据局部性更好。同样,按列遍历在列主要矩阵上更快。值得进行一些实验,以找出对于您的特定应用程序来说哪种更快。
Eigen 的默认设置是列主要顺序。因此,大多数 Eigen 库的开发和测试都是在列主要矩阵上完成的。这意味着,尽管我们旨在透明地支持列主要和行主要存储顺序,Eigen 库在列主要矩阵上可能效果最好。

参考地址

https://eigen.tuxfamily.org/dox/group__TopicStorageOrders.html

这篇关于Eigen中 Row-Major 和 Column-Major 存储顺序的区别的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1073037

相关文章

异构存储(冷热数据分离)

异构存储主要解决不同的数据,存储在不同类型的硬盘中,达到最佳性能的问题。 异构存储Shell操作 (1)查看当前有哪些存储策略可以用 [lytfly@hadoop102 hadoop-3.1.4]$ hdfs storagepolicies -listPolicies (2)为指定路径(数据存储目录)设置指定的存储策略 hdfs storagepolicies -setStoragePo

HDFS—存储优化(纠删码)

纠删码原理 HDFS 默认情况下,一个文件有3个副本,这样提高了数据的可靠性,但也带来了2倍的冗余开销。 Hadoop3.x 引入了纠删码,采用计算的方式,可以节省约50%左右的存储空间。 此种方式节约了空间,但是会增加 cpu 的计算。 纠删码策略是给具体一个路径设置。所有往此路径下存储的文件,都会执行此策略。 默认只开启对 RS-6-3-1024k

native和static native区别

本文基于Hello JNI  如有疑惑,请看之前几篇文章。 native 与 static native java中 public native String helloJni();public native static String helloJniStatic();1212 JNI中 JNIEXPORT jstring JNICALL Java_com_test_g

顺序表之创建,判满,插入,输出

文章目录 🍊自我介绍🍊创建一个空的顺序表,为结构体在堆区分配空间🍊插入数据🍊输出数据🍊判断顺序表是否满了,满了返回值1,否则返回0🍊main函数 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以:点赞+关注+评论+收藏(一键四连)哦~ 🍊自我介绍   Hello,大家好,我是小珑也要变强(也是小珑),我是易编程·终身成长社群的一名“创始团队·嘉宾”

Android fill_parent、match_parent、wrap_content三者的作用及区别

这三个属性都是用来适应视图的水平或者垂直大小,以视图的内容或尺寸为基础的布局,比精确的指定视图的范围更加方便。 1、fill_parent 设置一个视图的布局为fill_parent将强制性的使视图扩展至它父元素的大小 2、match_parent 和fill_parent一样,从字面上的意思match_parent更贴切一些,于是从2.2开始,两个属性都可以使用,但2.3版本以后的建议使

Collection List Set Map的区别和联系

Collection List Set Map的区别和联系 这些都代表了Java中的集合,这里主要从其元素是否有序,是否可重复来进行区别记忆,以便恰当地使用,当然还存在同步方面的差异,见上一篇相关文章。 有序否 允许元素重复否 Collection 否 是 List 是 是 Set AbstractSet 否

速了解MySQL 数据库不同存储引擎

快速了解MySQL 数据库不同存储引擎 MySQL 提供了多种存储引擎,每种存储引擎都有其特定的特性和适用场景。了解这些存储引擎的特性,有助于在设计数据库时做出合理的选择。以下是 MySQL 中几种常用存储引擎的详细介绍。 1. InnoDB 特点: 事务支持:InnoDB 是一个支持 ACID(原子性、一致性、隔离性、持久性)事务的存储引擎。行级锁:使用行级锁来提高并发性,减少锁竞争

javascript中break与continue的区别

在javascript中,break是结束整个循环,break下面的语句不再执行了 for(let i=1;i<=5;i++){if(i===3){break}document.write(i) } 上面的代码中,当i=1时,执行打印输出语句,当i=2时,执行打印输出语句,当i=3时,遇到break了,整个循环就结束了。 执行结果是12 continue语句是停止当前循环,返回从头开始。

maven发布项目到私服-snapshot快照库和release发布库的区别和作用及maven常用命令

maven发布项目到私服-snapshot快照库和release发布库的区别和作用及maven常用命令 在日常的工作中由于各种原因,会出现这样一种情况,某些项目并没有打包至mvnrepository。如果采用原始直接打包放到lib目录的方式进行处理,便对项目的管理带来一些不必要的麻烦。例如版本升级后需要重新打包并,替换原有jar包等等一些额外的工作量和麻烦。为了避免这些不必要的麻烦,通常我们

ActiveMQ—Queue与Topic区别

Queue与Topic区别 转自:http://blog.csdn.net/qq_21033663/article/details/52458305 队列(Queue)和主题(Topic)是JMS支持的两种消息传递模型:         1、点对点(point-to-point,简称PTP)Queue消息传递模型:         通过该消息传递模型,一个应用程序(即消息生产者)可以