首页 > 其他分享 >稀疏矩阵数据结构(如CSR、CSC格式)

稀疏矩阵数据结构(如CSR、CSC格式)

时间:2024-12-25 18:09:13浏览次数:3  
标签:存储 元素 矩阵 稀疏 CSC 非零 格式 数据结构 CSR

稀疏矩阵数据结构

稀疏矩阵(Sparse Matrix)是一种大多数元素为零的矩阵。在处理稀疏矩阵时,如果我们直接使用常规的二维数组来存储矩阵数据,将会浪费大量的存储空间,因为大部分元素都是零。为了解决这一问题,稀疏矩阵数据结构应运而生,通过只存储非零元素来大幅减少内存消耗。

最常用的稀疏矩阵存储格式包括 压缩行存储(CSR)压缩列存储(CSC)。这两种格式是用于存储稀疏矩阵的标准方法。

1. 压缩行存储(CSR,Compressed Sparse Row)

CSR 是一种常用的稀疏矩阵存储方式,它将矩阵的非零元素按行存储,并记录每行中非零元素的位置。CSR格式通过三个数组来存储稀疏矩阵的数据:

  • values:存储矩阵中的所有非零元素。
  • column_indices:存储每个非零元素对应的列索引。
  • row_pointer:指示每行开始非零元素的位置。在这个数组中,元素 row_pointer[i] 表示第 i 行的第一个非零元素在 values 数组中的位置。

举个例子

假设我们有一个 4x5 的稀疏矩阵如下:

[
\begin{bmatrix}
0 & 0 & 3 & 0 & 0 \
0 & 0 & 0 & 4 & 0 \
5 & 0 & 0 & 0 & 6 \
0 & 7 & 0 & 0 & 0
\end{bmatrix}
]

对于这个矩阵,使用CSR格式存储时,三个数组会是:

  • values:[3, 4, 5, 6, 7]
  • column_indices:[2, 3, 0, 4, 1]
  • row_pointer:[0, 1, 2, 4, 5]

说明

  • values 存储了矩阵中的非零元素。
  • column_indices 存储了每个非零元素对应的列索引。
  • row_pointer 存储了每行的起始非零元素在 values 数组中的位置。

这样,通过这三个数组,CSR格式可以高效地存储稀疏矩阵的数据并快速访问。

2. 压缩列存储(CSC,Compressed Sparse Column)

CSC 格式与CSR格式非常相似,只是它将矩阵的非零元素按列存储。CSC格式通过三个数组来存储稀疏矩阵的数据:

  • values:存储矩阵中的所有非零元素。
  • row_indices:存储每个非零元素对应的行索引。
  • column_pointer:指示每列开始非零元素的位置。在这个数组中,元素 column_pointer[j] 表示第 j 列的第一个非零元素在 values 数组中的位置。

举个例子

假设我们有一个 4x5 的稀疏矩阵如下:

[
\begin{bmatrix}
0 & 0 & 3 & 0 & 0 \
0 & 0 & 0 & 4 & 0 \
5 & 0 & 0 & 0 & 6 \
0 & 7 & 0 & 0 & 0
\end{bmatrix}
]

对于这个矩阵,使用CSC格式存储时,三个数组会是:

  • values:[3, 5, 4, 6, 7]
  • row_indices:[0, 2, 1, 2, 3]
  • column_pointer:[0, 1, 2, 3, 5, 5]

说明

  • values 存储了矩阵中的非零元素。
  • row_indices 存储了每个非零元素对应的行索引。
  • column_pointer 存储了每列的起始非零元素在 values 数组中的位置。

3. CSR与CSC的对比

特性 CSR(压缩行存储) CSC(压缩列存储)
存储方式 按行存储非零元素 按列存储非零元素
使用数组数目 3个:valuescolumn_indicesrow_pointer 3个:valuesrow_indicescolumn_pointer
适用的操作 快速按行遍历、矩阵乘法、求解线性方程组等 快速按列遍历、矩阵乘法、求解线性方程组等
优势 对于按行访问较快(例如:矩阵-向量乘法) 对于按列访问较快(例如:矩阵-向量乘法)
适用场景 行操作为主的稀疏矩阵运算(如行扫描) 列操作为主的稀疏矩阵运算(如列扫描)

4. 其他稀疏矩阵格式

除了CSR和CSC格式外,还有一些其他的稀疏矩阵存储格式:

  • COO(Coordinate List)格式:通过三组数组来存储矩阵的行索引、列索引和非零值,适合于稀疏矩阵的插入操作。
  • DIA(Diagonal Storage)格式:适用于对角线矩阵,通过存储每一对角线上的非零元素来节省空间。
  • LIL(List of Lists)格式:每行的非零元素用链表存储,适用于稀疏矩阵的动态修改。

5. 稀疏矩阵操作

在稀疏矩阵中,常见的操作有:

  • 矩阵乘法:稀疏矩阵乘法可以利用稀疏矩阵的数据结构高效实现,只对非零元素进行运算。
  • 矩阵转置:稀疏矩阵的转置可以通过调整矩阵的行列索引来实现。
  • 求解线性方程组:稀疏矩阵经常用于求解线性方程组,通过专门的稀疏求解器(如CG、GMRES)可以高效地处理。

6. 总结

使用稀疏矩阵数据结构(如CSR、CSC格式)可以有效减少存储和计算开销,尤其是在处理大规模稀疏矩阵时。通过选择合适的存储格式,可以根据具体的应用场景来优化操作性能。

标签:存储,元素,矩阵,稀疏,CSC,非零,格式,数据结构,CSR
From: https://www.cnblogs.com/liuyajun2022/p/18631155

相关文章

  • 「数据结构课程设计」二叉排序树与文件操作
    功能要求:(1)从键盘输入一组学生记录建立二叉排序树;(2)中序遍历二叉排序树;(3)求二叉排序树深度;(4)求二叉排序树的所有节点数和叶子节点数;(5)向二叉排序树插入一条学生记录;(6)从二叉排序树中删除一条学生记录;(7)从二叉排序树中查询一条学生记录;(8)以广义表的形式输出二叉排序树该文件也......
  • .NET 中的线程安全数据结构
    目录1.ConcurrentQueue2.ConcurrentStack3.ConcurrentBag4.ConcurrentDictionary<TKey,TValue>5.BlockingCollection6.ImmutableList7.SynchronizedCollection8.SynchronizedReadOnlyCollection9.SynchronizedKeyedCollection<K,T>在多线程编程中,线程安全的数据结构是......
  • 4、数据结构与算法解析(C语言版)--栈
    栈的数据存储遵循“后进先出的规则”,这在计算机里面是非常有用的,比如word等编辑软件的"撤销"功能,就是使用栈进行实现的。1、创建项目 main.h#ifndef_MAIN_H#define_MAIN_H#include<stdio.h>#include<stdlib.h>#include<time.h>#defineTRUE1#defineFALSE0......
  • 省选集训 day 1 数据结构杂题
    A比较套路的题目,第一次见还是有难度的。关于\(+1\)的更改,事实上是找到二进制下极长的末尾\(1\)段并进位。考虑使用Trie维护这个操作,相当于建立一颗从低位开始的Trie,然后swap儿子并进入swap后的新左子树递归操作。然后对于邻域的问题,一般考虑每个点单独维护其儿子,然后特......
  • RK3568平台开发系列讲解(中断及异常篇)Linux 中断系统中的重要数据结构
    ......
  • 数据结构实验
    (一)线性表1#include<bits/stdc++.h>usingnamespacestd;intmain(){intn;multiset<int>ms;cin>>n;for(inti=1;i<=n;i++){intx;cin>>x;ms.insert(x);}intx;cin......
  • 数据结构实验
    (一)线性表1#include<bits/stdc++.h>usingnamespacestd;intmain(){intn;multiset<int>ms;cin>>n;for(inti=1;i<=n;i++){intx;cin>>x;ms.insert(x);}intx;cin......
  • 数据结构实验14-哈希查找&排序1
    目录【id:113】【20分】A.DS哈希查找--链地址法【id:114】【20分】B.DS哈希查找与增补【id:119】【10分】C.DS哈希查找—二次探测再散列【id:115】【20分】D.DS哈希查找—线性探测再散列【id:163】【10分】E.DS排序--直接插入排序【id:122】【10分】F.DS排序--希......
  • 数据结构课程设计报告-约瑟夫双向生死游戏
    一、课题概述约瑟夫双向生死游戏是一个关于30个旅客的游戏。由于船只超载并遇到恶劣的天气,船长告诉乘客,只有将船上一半的人投入海中,才能确保剩下的人的安全。为了确定被投入海中的旅客,大家决定围成一圈,从第一个人开始,按顺时针方向依次报数。当报数到第9个人时,将该人投入海中,然......
  • NLP 中文拼写检测开源-01-基于贝叶斯公式的拼写检查器 CSC
    拼写纠正系列NLP中文拼写检测实现思路NLP中文拼写检测纠正算法整理NLP英文拼写算法,如果提升100W倍的性能?NLP中文拼写检测纠正Paperjava实现中英文拼写检查和错误纠正?可我只会写CRUD啊!一个提升英文单词拼写检测性能1000倍的算法?单词拼写纠正-03-leetcodeedit-d......