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

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

flyfish

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

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

py 复制代码
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 Order
        for 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 Order
        for 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
相关推荐
Leweslyh2 分钟前
【实战】如何在家定位国际空间站 (ISS)? —— 坐标转换的魔法 (例题 5.9)
开发语言·javascript·ecmascript
Sheep Shaun3 分钟前
深入理解AVL树:从概念到完整C++实现详解
服务器·开发语言·数据结构·c++·后端·算法
_leoatliang3 分钟前
基于Python的深度学习以及常用环境测试案例
linux·开发语言·人工智能·python·深度学习·算法·ubuntu
leiming64 分钟前
C语言联合体union的用法(非常详细,附带示例)
java·python·算法
少控科技4 分钟前
QT新手日记025 - W002程序代码
开发语言·qt
a程序小傲6 分钟前
Maven 4 要来了:15 年后,Java 构建工具迎来“彻底重构”
java·开发语言·spring boot·后端·spring·重构·maven
云深麋鹿8 分钟前
二.顺序表和链表
c语言·开发语言·数据结构·链表
XH华13 分钟前
备战蓝桥杯,第二章:C++语言的输入输出(上)
开发语言·c++·蓝桥杯
C++ 老炮儿的技术栈15 分钟前
Qt中自定义 QmyBattery 电池组件开发
c语言·开发语言·c++·windows·qt·idea·visual studio
Dxy123931021617 分钟前
Python的PIL如何转Base64字符串:完整指南
开发语言·python