稀疏矩阵的常用存储格式(COO、CSR、CSC)

图结构数据

图是用于描述对象间关系的基本结构,顶点表示对象,边表示连接关系。
根据连接关系的紧密可以将图分为稀疏图和稠密图,两者是相对的概念,并不存在明确的划分界限。稀疏图可以理解为仅有少部分对象间存在关联,稠密图反之。实际应用中的图往往都是稀疏图。采用直观的办法来存储图往往会造成极大的空间浪费,如邻接矩阵(稀疏图对应的邻接矩阵中绝大部分的元素为零,无实际意义)。因此需要考虑寻求其它格式来进行高效存储。

稀疏矩阵的格式

稀疏矩阵的存储格式往往依赖具体问题中稀疏矩阵的特征,因此其格式比较多。其中一部分是相对简单而又普遍使用的。这篇文章主要介绍常用的COO、CSR、CSC存储格式:

  • COO, coordinate format.
  • CSR, compressed sparse row format.
  • CSC, compressed sparse column format.

COO

COO格式是将矩阵中的非零元素以坐标的方式存储。例如下面的邻接矩阵,我们可以用两个长度为n的整数数组分别表示行列索引,以及用另一个长度为n的实数数组表示矩阵非零元素。其中n为矩阵中非0元素个数。具体如下图所示:
在这里插入图片描述

CSR

对于COO格式的一种改进就是CSR格式,这种格式要求矩阵元按行顺序存储,每一行中的元素可以乱序存储。那么对于每一行,就不需要记录所有元素的行指标。只需要用一个指针表示每一行元素的起始位置即可。以下图为例,具体包含以下数据结构:

  1. Data,用来存储矩阵中的非零元素的值;
  2. Indices,第i个元素记录了Data[i]元素的列数;
  3. Index Pointers, 第i个元素记录了第i行元素在Data数组的起始位置,第i+1个元素为第i行元素在Data数组的终止位置(不包含右边界)。例如第0行元素为Data[0, 2)。

在这里插入图片描述

CSC

CSC是按列来存储一个稀疏矩阵的,其原理与CSC类似。具体包含以下数据结构:

  1. Data,用来存储矩阵中的非零元素的值;
  2. Indices,第i个元素记录了Data[i]元素的行数;
  3. Index Pointers, 第i个元素记录了第i列元素在Data数组的起始位置,第i+1个元素为第i列元素在Data数组的终止位置(不包含右边界)。
稀疏矩阵CSC(Compressed Sparse Column)存储方式是一种压缩列存储方式,它将所有的非零元素按列压缩存储,每一列的非零元素都存储在一个连续的数组中,同时记录每一列的非零元素在该列中的起始位置和终止位置。 具体地,CSC格式包含三个数组:data、indices和indptr。 - data:是一个一维数组,存储所有的非零元素,按列压缩存储,从左到右,从上到下,每列的非零元素按行顺序存储; - indices:是一个一维数组,存储所有非零元素的行索引,按列压缩存储,从左到右,从上到下,每列的非零元素按行顺序存储; - indptr:是一个一维数组,存储每一列的第一个非零元素在data和indices中的位置,以及最后一个非零元素的下一个位置,也就是说,indptr[k+1]-indptr[k]就是第k列的非零元素个数。 以一个例子来说明CSC格式存储方式。给定一个3×3的矩阵: ``` 1 0 0 0 0 2 0 3 0 ``` 将其用CSC格式存储,得到以下三个数组: ``` data = [1, 3, 2] indices = [0, 2, 1] indptr = [0, 1, 3, 3] ``` 其中,data、indices和indptr分别表示非零元素的值、行索引和列指针。例如,data中的第一个元素1表示第一列的第一个非零元素的值,indices中的第一个元素0表示第一列的第一个非零元素在原矩阵中的行索引,indptr中的第一个元素0表示第一列的第一个非零元素在data和indices中的起始位置,最后一个元素3表示最后一列的最后一个非零元素的下一个位置。 CSC格式存储方式在矩阵乘法和其他矩阵运算中具有很好的性质,例如,可以高效地进行矩阵乘法、矩阵转置、矩阵向量乘法等运算。同时,CSC格式也是SciPy中的稀疏矩阵存储和计算的默认格式之一,对于大规模矩阵的处理具有非常重要的作用。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值