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

相关文章

2.1/5.1和7.1声道系统有什么区别? 音频声道的专业知识科普

《2.1/5.1和7.1声道系统有什么区别?音频声道的专业知识科普》当设置环绕声系统时,会遇到2.1、5.1、7.1、7.1.2、9.1等数字,当一遍又一遍地看到它们时,可能想知道它们是什... 想要把智能电视自带的音响升级成专业级的家庭影院系统吗?那么你将面临一个重要的选择——使用 2.1、5.1 还是

Python中@classmethod和@staticmethod的区别

《Python中@classmethod和@staticmethod的区别》本文主要介绍了Python中@classmethod和@staticmethod的区别,文中通过示例代码介绍的非常详细,对大... 目录1.@classmethod2.@staticmethod3.例子1.@classmethod

Golan中 new() 、 make() 和简短声明符的区别和使用

《Golan中new()、make()和简短声明符的区别和使用》Go语言中的new()、make()和简短声明符的区别和使用,new()用于分配内存并返回指针,make()用于初始化切片、映射... 详细介绍golang的new() 、 make() 和简短声明符的区别和使用。文章目录 `new()`

Python中json文件和jsonl文件的区别小结

《Python中json文件和jsonl文件的区别小结》本文主要介绍了JSON和JSONL两种文件格式的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下... 众所周知,jsON 文件是使用php JSON(JavaScripythonpt Object No

JAVA利用顺序表实现“杨辉三角”的思路及代码示例

《JAVA利用顺序表实现“杨辉三角”的思路及代码示例》杨辉三角形是中国古代数学的杰出研究成果之一,是我国北宋数学家贾宪于1050年首先发现并使用的,:本文主要介绍JAVA利用顺序表实现杨辉三角的思... 目录一:“杨辉三角”题目链接二:题解代码:三:题解思路:总结一:“杨辉三角”题目链接题目链接:点击这里

使用JavaScript操作本地存储

《使用JavaScript操作本地存储》这篇文章主要为大家详细介绍了JavaScript中操作本地存储的相关知识,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下... 目录本地存储:localStorage 和 sessionStorage基本使用方法1. localStorage

结构体和联合体的区别及说明

《结构体和联合体的区别及说明》文章主要介绍了C语言中的结构体和联合体,结构体是一种自定义的复合数据类型,可以包含多个成员,每个成员可以是不同的数据类型,联合体是一种特殊的数据结构,可以在内存中共享同一... 目录结构体和联合体的区别1. 结构体(Struct)2. 联合体(Union)3. 联合体与结构体的

什么是 Ubuntu LTS?Ubuntu LTS和普通版本区别对比

《什么是UbuntuLTS?UbuntuLTS和普通版本区别对比》UbuntuLTS是Ubuntu操作系统的一个特殊版本,旨在提供更长时间的支持和稳定性,与常规的Ubuntu版本相比,LTS版... 如果你正打算安装 Ubuntu 系统,可能会被「LTS 版本」和「普通版本」给搞得一头雾水吧?尤其是对于刚入

python中json.dumps和json.dump区别

《python中json.dumps和json.dump区别》json.dumps将Python对象序列化为JSON字符串,json.dump直接将Python对象序列化写入文件,本文就来介绍一下两个... 目录1、json.dumps和json.dump的区别2、使用 json.dumps() 然后写入文

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

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