稀疏矩阵存储格式总结

news2024/12/23 19:01:10

稀疏矩阵是指矩阵中的元素大部分是0的矩阵,实际问题中大规模矩阵基本上都是稀疏矩阵,很多稀疏度在90%甚至99%以上,大规模的稀疏造成了大量无效数据的计算和存储资源占用,也无法有效的载入有限内存计算。因此我们需要有高效的稀疏矩阵存储格式。本文总结几种典型的格式:COO,CSR,DIA,ELL,HYB,HASH,BSR。

COO

在这里插入图片描述

  • 采用三元组(row, col, data)(或称为ijv format)的形式来存储矩阵中非零元素的信息
  • 三个数组 rowcoldata 分别保存非零元素的行下标、列下标与值(一般长度相同)
  • coo[row[k]][col[k]] = data[k] ,即矩阵的第 row[k] 行、第 col[k] 列的值为 data[k]
适用场景
  • 主要用来创建矩阵,因为coo_matrix无法对矩阵的元素进行增删改等操作
  • 一旦创建之后,除了将之转换成其它格式的矩阵,几乎无法对其做任何操作和矩阵运算
①优点
  • 转换成其它存储格式很快捷简便(tobsr()tocsr()to_csc()to_dia()to_dok()to_lil()
  • 能与CSR / CSC格式的快速转换
  • 允许重复的索引(例如在1行1列处存了值2.0,又在1行1列处存了值3.0,则转换成其它矩阵时就是2.0+3.0=5.0)
②缺点
  • 不支持切片和算术运算操作
  • 如果稀疏矩阵仅包含非0元素的对角线,则对角存储格式(DIA)可以减少非0元素定位的信息量
  • 这种存储格式对有限元素或者有限差分离散化的矩阵尤其有效

CSR

在这里插入图片描述

  • csr_matrix是按行对矩阵进行压缩的
  • 通过 columu indices, row offsetvalue来确定矩阵。
  • value表示矩阵中的非零数据
  • 对于第 i 行而言,该行中非零元素的列索引为 indices[indptr[i]:indptr[i+1]]
  • 可以将 columu indptr 理解成利用其自身索引 i 来指向第 i 行元素的列索引
  • 根据[indptr[i]:indptr[i+1]],我就得到了该行中的非零元素个数,如
    • row_offset[i] = 3row_offset[i+1] = 3 ,则第 i 行的没有非零元素
    • row_offset[j] = 6row_offset[j+1] = 7 ,则第 j 行的非零元素的列索引为 indices[6:7]
  • 得到了行索引、列索引,相应的数据存放在: data[indptr[i]:indptr[i+1]]
适用场景
  • 常用于读入数据后进行稀疏矩阵计算,运算高效
①优点
  • 高效的稀疏矩阵算术运算
  • 高效的行切片
  • 快速地矩阵矢量积运算
②缺点
  • 较慢地列切片操作(可以考虑CSC)
  • 转换到稀疏结构代价较高(可以考虑LIL,DOK)
改进(BCSR、CSC)

注意到其中规则:若 row_offset[i] == row_offset[i+1] ,则第 i 行的全为0元素。由于稀疏矩阵可能连续多行为全0元素行,则CSR的row_offset会有大量稀疏性,则有两种改进:

  • BCSR(双重稀疏行压缩):可以再新增一个pos数组存row_offset数组中offset数据的所属行,而无需大量的相同offset数据重复。
  • CSC(列压缩):行压缩转换为列压缩,原理相同

ELL

在这里插入图片描述

Linked List Matrix 链表矩阵

  • 使用两个列表存储非0元素data
  • row保存非零元素所在的列
适用场景
  • 适用的场景是逐渐添加矩阵的元素(且能快速获取行相关的数据)
  • 需要注意的是,该方法插入一个元素最坏情况下可能导致线性时间的代价,所以要确保对每个元素的索引进行预排序
①优点
  • 适合递增的构建成矩阵
  • 转换成其它存储方式很高效
  • 支持灵活的切片
②缺点
  • 当矩阵很大时,考虑用coo
  • 算术操作,列切片,矩阵向量内积操作慢

HYB

在这里插入图片描述

如果某一行特别多,造成其他行的浪费,那么把这些多出来的元素(比如第三行的9,其他每一行最大都是2个元素)用COO单独存储。

DIA

在这里插入图片描述

Diagonal Matrix 对角存储格式

  • 最适合对角矩阵的存储方式
  • dia_matrix通过两个数组确定: dataoffsets
  • data :对角线元素的值
  • offsets :第 ioffsets 是当前第 i 个对角线和主对角线的距离
  • data[k:] 存储了 offsets[k] 对应的对角线的全部元素

HASH (dok_matrix)

Dictionary of Keys Matrix 按键字典矩阵

  • 采用字典来记录矩阵中不为0的元素
  • 字典的 key 存的是记录元素的位置信息的元组, value 是记录元素的具体值

适用于逐渐添加矩阵的元素。

①优点

  • 对于递增的构建稀疏矩阵很高效,比如定义该矩阵后,想进行每行每列更新值,可用该矩阵。
  • 可以高效访问单个元素,只需要O(1)

②缺点

  • 不允许重复索引(coo中适用),但可以很高效的转换成coo后进行重复索引
代码示例
dok = sparse.dok_matrix((5, 5), dtype=np.float32)
for i in range(5):
    for j in range(5):
        dok[i,j] = i+j    # 更新元素
# zero elements are accessible
dok[(0, 0)]  # = 0
dok.keys() # {(0, 0), ..., (4, 4)}

dok.toarray()
'''
[[0. 1. 2. 3. 4.]
 [1. 2. 3. 4. 5.]
 [2. 3. 4. 5. 6.]
 [3. 4. 5. 6. 7.]
 [4. 5. 6. 7. 8.]]
 '''

BSR

在这里插入图片描述

  • 基于行的块压缩,与csr类似,都是通过dataindicesrow_offset来确定矩阵
  • 与csr相比,只是data中的元数据由0维的数变为了一个矩阵(块),其余完全相同
  • 块大小 blocksize
    • 块大小 (R, C) 必须均匀划分矩阵 (M, N) 的形状。
    • R和C必须满足关系:M % R = 0N % C = 0
    • 适用场景及优点参考csr
  • 也可以用块压缩组合COO

参考:

https://www.cnblogs.com/xbinworld/p/4273506.html

https://zhuanlan.zhihu.com/p/188700729

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringCloud:ElasticSearch之数据同步

elasticsearch中的酒店数据来自于mysql数据库,因此mysql数据发生改变时,elasticsearch也必须跟着改变,这个就是elasticsearch与mysql之间的数据同步。 1.思路分析 常见的数据同步方案有三种: 同步调用异步通知监听binlog 1.1.同…

Nacos配置中心的详解与搭建

Namespace 简介 用于进行租户粒度的配置隔离,不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置 配置Namespace 点击nacos的命名空间——点击新建命名空间 开发环境【dev】测试环境【test】正式环境【prod】 DataID 简介 Data ID 通常用于…

Node.js 下载与安装教程

文章目录 Node.js 下载Node.js 安装npm 配置配置node_path修改用户变量更换npm源为淘宝镜像全局安装基于淘宝源的cnpm Node.js 下载 1.进入nodejs官网:https://nodejs.org/en 2.单击downloads 3.此时滑动滚动条,找到并单击 previous release 4.在此页…

<C++>lesson1.C++入门上

文章目录 1. C关键字(C98)💚2. 命名空间🤎2.1 命名空间定义2.2命名空间的使用 3. C输入/输出🖤4.缺省参数💙4.1 缺省参数概念4.2 缺省参数分类 5. 函数重载❤️5.1 函数重载的概念5.2 C支持函数重载的原理 6. 引用💜6.…

Day4_Springboot集成Mybatis

上一节使用springboot框架搭建了项目,并创建了数据库user表,接下来集成mybatis对用户表实现增删改查操作~~~~ 目录 SpringBootApplication.java 创建model/entity文件夹,存放实体类 UserDao.java UserController.java 浏览器Json插件&am…

Leetcode刷题日志3.0

目录 前言: 1.相对名次​​​​​​ 2.学生出勤记录 I 3.重塑矩阵 4.分糖果 5.最长和谐子序列 6.种花问题 前言: 今天我就分享一下最近在leetcode刷到的题,希望对大家有所帮助。编程语言:Python3。好了废话不多讲了&…

消息队列使用场景介绍

消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题 实现高性能,高可用,可伸缩和最终一致性架构 使用较多的消息队列有ActiveMQ,RabbitMQ,ZeroMQ,Ka…

【华中农业大学2023年十二届程序设计竞赛(同步赛)】B. 写信

文章目录 题目描述思路代码 题目描述 思路 错位排序,可搜索引擎。复杂度太高 递推式: f [ n ] ( n − 1 ) ∗ ( f [ n − 1 ] f [ n − 2 ] ) f[n](n-1)*(f[n-1]f[n-2]) f[n](n−1)∗(f[n−1]f[n−2]) 正解:打表!YYDS 1e9的数…

12.Hadoop练习题

1.网络问题 (1)机器联网出现问题 情况:ping一下百度,发现百度ping不通 sudo vim /etc/sysconfig/network-scripts/ifcfg-ens33检查GATEWAY是否正确,修改过来之后保存退出,重启虚拟机 sudo systemctl re…

图论 (Java) 从入门到入土 /第一部分 图的基础-图的定义/

零.前言 图,是一种比较复杂的数据结构。和树的一个节点只和上层一个节点相连不同,在图中,任意两个节点都可能相连,且可能具有方向性,并且节点的边具有权重,因此,图被用于描述各种复杂的数据对象…

python:tkinter 生成 buttonBar 示例

tk_test1.py # -*- coding: utf-8 -*- import os import tkinter as tk from tkinter import filedialogroot tk.Tk() root.title("生成 buttonBar 示例 ") var tk.StringVar() # 动态字符串 label tk.Label(root, textvariablevar) listbox tk.Listbox(root, s…

题集-快慢指针的应用(链表)

1.中心结点 代码: /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/struct ListNode* middleNode(struct ListNode* head) {if(head->nextNULL) return head;struct ListNode* fast head,*slow …

初阶数据结构——顺序表和链表(单链表)

目录 1.线性表2.顺序表SeqList.hSeqList.cTest.c数组习题移除元素删除有序数组中的重复项合并两个有序数组 顺序表的问题及思考 3.链表SList.hSList.cTest.c 1.线性表 线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中…

BI技巧丨计算组折线图

PowerBI中,通常我们会使用折线图来展示数据的趋势情况。但是当数据类别过多的时候,需求也在进一步深入,往往还需要我们将用户关注的重要节点标注出来,例如:最大值和最小值。 很早之前,白茶曾经写过一篇关于…

HTML学习笔记一

目录 HTML学习笔记 一、HTML标签 1、HTML语法规范 1.1标签的语法概述 1.2标签关系 2、HTML基本结构标签 2.1第一个HTML 2.2基本结构标签总结 3、开发工具 4、HTML常用标签 4.1标签的语义 4.2标题标签 4.3段落和换行标签 4.4文本格式化标签 4.5div和span标签 4.…

Linux云服务器的使用,以及运行Python程序、相关Linux指令

目录 1、使用Linux云服务器的软件 2、Linux系统运行Python程序 3、Linux系统查看包、虚拟环境、安装包等 以下几个深度学习服务器都不错:智星云、AutoDL、恒源云 1、使用Linux云服务器的软件 MobaXterm_Personal 推荐MobaXterm_Personal mobaxterm是一款方便网站…

基于Flask的留言板的设计与实现

这是《Flask Web开发实战:入门、进阶与原理解析》这本书中的一个小项目,我在学习后根据书中的教程实现了留言板的功能,并结合我的思路将代码做了一些调整。 下面这是实现后的展示图片 文章目录 设计思路项目代码exts.pymodels.pyforms.pyerrors.pycomma…

DMDTS:DM迁移到SQL脚本

DMDTS:DM迁移到SQL脚本 环境介绍1 注册工程2 新建迁移3 迁移工具介绍4 选择迁移方式5 配置数据源6 配置SQL脚本文件7 配置源端获取对象方式和迁移策略8 选择指定对象复制9 选择迁移对象9.1 迁移对象的配置 - - 转换 设置表的映射关系 10 审阅迁移任务11 完成迁移 环境介绍 DM管…

一文了解使用Moonbeam原生跨链的潜力项目

跨链互连合约是Moonbeam独特的原生跨链解决方案,不仅帮助开发团队在Moonbeam网络即可解锁不同公链的特色功能,而且各类去中心化应用的终端使用者能因此获得更便捷安全的跨链体验。 Moonbeam的原生跨链解决方案包含Polkadot生态、不同异构链和Moonbeam生…

hitcontraining_uaf

1,三连 基本信息:x86-32-el,堆题思路; 保护:Partial RELRO。 堆题多看一个Libc: 2,IDA分析 main功能: add_note()功能: malloc了两次: 8字节填充(利用点之一&#xf…