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 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/720649.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

从实例出发,深入探索Java SE中数组的易错点

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…

神经网络模型---AlexNet

一、AlexNet 1.导入tensorflow库&#xff0c;这里给简称为tf库 import tensorflow as tf from tensorflow.keras import datasets, layers, modelsdatasets&#xff1a;是用于训练和测试机器学习模型的数据集合 layers&#xff1a;是构建神经网络模型的关键组成部分 models&a…

豆包高质量声音有望复现-Seed-TTS

我们介绍了 Seed-TTS&#xff0c;这是一个大规模自回归文本转语音 &#xff08;TTS&#xff09; 模型系列&#xff0c;能够生成与人类语音几乎没有区别的语音。Seed-TTS 作为语音生成的基础模型&#xff0c;在语音上下文学习方面表现出色&#xff0c;在说话人的相似性和自然性方…

摄像头图像矫正的表格生成方法

1.设置单元格高宽 点击表格左上角 的 小三角 列宽: HOME -> Rows and Columns -> Column Width 5 CM 行高: HOME -> Rows and Columns -> Row Height 5 CM 2.设置 条件格式 HOME -> Conditional Formatting-> Manager Rules 点击 左上方 New Rule…

win11右键小工具

开头要说的 在日常使用场景中&#xff0c;大家如果用的是新的笔记本电脑&#xff0c;应该都是安装的win11系统&#xff0c; 当然win11系统是最被诟病的&#xff0c; 因为有很多人觉得很难操作&#xff0c; 就比如一个小小的解压操作&#xff0c; 在win7和win10上&#xff…

gitlab 身份验证手机号验证没86

处理方案 在浏览器中摁 【F12】打开控制台&#xff0c;选择网络模块&#xff0c;找到手机号列表的请求&#xff0c;请求是 https://gitlab.com/-/countries&#xff0c;右击数据区域点击【替换内容】如下&#xff1a; ![在这里插入图片描述](https://img-blog.csdnimg.cn/di…

gRPC(Google Remote Procedure Call Protocol)谷歌远程过程调用协议

文章目录 1、gRPC简介2、gRPC核心的设计思路3、gPRC与protobuf关系 1、gRPC简介 gPRC是由google开源的一个高性能的RPC框架。Stubby Google内部的RPC&#xff0c;演化而来的&#xff0c;2015年正式开源。云原生时代是一个RPC标准。 2、gRPC核心的设计思路 网络通信 ---> gPR…

API-声明变量const优先

学习目标&#xff1a; 掌握声明变量const优先 学习内容&#xff1a; 变量声明总结 变量声明&#xff1a; 变量声明有三个var let const。 首先var排除&#xff0c;老派写法&#xff0c;问题很多&#xff0c;可以淘汰掉… 建议&#xff1a;const优先&#xff0c;尽量使用cons…

amr文件怎么转换成mp3?超好用的四种转换方法介绍!

amr文件怎么转换成mp3&#xff1f;在当今数字化时代&#xff0c;音频格式的多样性给我们带来了更广泛的选择&#xff0c;其中AMR格式就是其中之一&#xff0c;AMR格式在录音和通话领域得到广泛应用&#xff0c;但与此同时&#xff0c;它也存在一些挑战和局限性&#xff0c;尽管…

推荐常用的三款源代码防泄密软件

三款源代码防泄密软件——安秉源代码加密、Virbox Protector 和 MapoLicensor——确实各自在源代码保护的不同方面有其专长。这些软件可以满足企业对于源代码保护的三大需求&#xff1a;防止泄露、防止反编译和防止破解。 安秉源代码加密&#xff1a; 专注于源代码文件的加密&…

安卓Context上下文

目录 前言一、Context简介二、Application Context2.1 Application Context的创建过程2.2 Application Context的获取过程 三、Activity的Context创建过程四、Service的Context创建过程 前言 Context也就是上下文对象&#xff0c;是Android较为常用的类&#xff0c;但是对于Co…

C++ 70 之 类模版中的成员函数,在类外实现

#include <iostream> #include <string> using namespace std;template<class T1, class T2> class Students10{ public:T1 m_name;T2 m_age;Students10(T1 name, T2 age); // 类内声明 类外实现// {// this->m_name name;// this->m_age …

【PPT设计前沿】2024年PPT新趋势,让你的演示文稿引领潮流!

文章目录 一、简约风格的新诠释二、动态元素与交互性的深度融合三、个性化与定制化的独特展现四、大数据与可视化的创新应用五、绿色环保与可持续性的倡导《PPT完美设计入门与进阶/入门与进阶》图书特色内容简介目录前言/序言 获取方式 随着技术的不断革新和创意设计的蓬勃发展…

技术分析:开源大模型的兴起与热门项目推荐

技术分析&#xff1a;开源大模型的兴起与热门项目推荐 引言 随着人工智能&#xff08;AI&#xff09;技术的不断发展&#xff0c;开源大模型成为了许多程序员和研究人员关注的焦点。开源项目不仅促进了技术的快速迭代和普及&#xff0c;还为更多的人提供了学习和实践的机会。…

提取人脸——OpenCV

提取人脸 导入所需的库创建窗口显示原始图片显示检测到的人脸创建全局变量定义字体对象定义一个函数select_image定义了extract_faces函数设置按钮运行GUI主循环运行显示 导入所需的库 tkinter&#xff1a;用于创建图形用户界面。 filedialog&#xff1a;用于打开文件对话框。 …

PR软件视频抠图换背景

1 新建项目 2 新建序列 在项目的右下角有个图标&#xff0c;新建 序列 序列是视频的制作尺寸&#xff0c;根据自己的需要选择 3 新建颜色遮罩 在项目的右下角--新建颜色遮罩--选择黑色--确定 4 导入视频 把要导入视频的文件夹打开&#xff0c;把视频拖到 项目 里 把黑色遮罩拖…

苹果电脑下载vite包错

苹果电脑下载vite包错/Users/lili/.npm/_cacache/index-v5/c5/50/b451703d03b3802b9ee6b7ff2b0bde4de7f26830eb52c904d6911c137cf8包错解决方式 解决方式&#xff1a;sudo chown -R 501:20 "/Users/wangxin/.npm"

python连接数据库,相关数据处理

随机生成一千个数据插入large_db中 # 这是一个示例 Python 脚本。# 按 ShiftF10 执行或将其替换为您的代码。 # 按 双击 Shift 在所有地方搜索类、文件、工具窗口、操作和设置。 import pandas as pd from sqlalchemy import create_engine from faker import Faker# 初始化fa…

MySQL日志——redolog

redo log&#xff08;重做日志&#xff09; 为什么需要redo log&#xff1f; 在mysql提交一个事务后&#xff0c;这个事务所作的数据修改并不会直接保存到磁盘文件中&#xff0c;而是先保存在buffer pool缓冲区中&#xff0c;在需要读取数据时&#xff0c;先从缓冲区中找&…

图片怎么弄成黑白的?关于将图片改成黑白的几种方法

图片怎么弄成黑白的&#xff1f;黑白照片以其独特的艺术魅力和经典的视觉效果&#xff0c;依然在摄影和图像处理中占据重要地位。无论是为了追求怀旧的氛围&#xff0c;还是为了突出图像的构图和光影效果&#xff0c;许多人都希望将彩色图片转换成黑白图片。这不仅可以赋予图像…