跳转至

CSR & CSC

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

源代码实现

https://github.com/scipy/scipy/blob/3b36a574dc657d1ca116f6e230be694f3de31afc/scipy/sparse/sparsetools/csr.h#L376

https://github.com/scipy/scipy/blob/3b36a574dc657d1ca116f6e230be694f3de31afc/scipy/sparse/sparsetools/csc.h#L111

https://github.com/scipy/scipy/blob/main/scipy/sparse/sparsetools/coo.h

https://github.com/scipy/scipy/blob/main/scipy/sparse/sparsetools/csr.h

CSR - csr_matrix

Compressed Sparse Row Matrix 压缩稀疏行格式

  • csr_matrix是按行对矩阵进行压缩的

  • 通过 indices, indptrdata 来确定矩阵。

  • data 表示矩阵中的非零数据

  • 对于第 i 行而言,该行中非零元素的列索引为 indices[i],第i个元素在第indices[i]列。

  • 可以将 indptr 理解每行的元素个数,len(indptr) = len(data) + 1。作差得到某行元素个数。

  • 根据indptr[i+1] - indptr[i],我就得到了该行中的非零元素个数,如

    • index[i] = 3index[i+1] = 3 ,则第 i 行的没有非零元
  • 、素
  • index[j] = 6index[j+1] = 7 ,则第 j 行的非零元素的列索引为 indices[6:7]

  • 得到了行索引、列索引,相应的数据存放在: data[indptr[i]:indptr[i+1]]

image-20221026172855195'

  • 对于矩阵第 0 行,我们需要先得到其非零元素列索引

    • indptr[0] = 0indptr[1] = 2 可知,作差可知第 0 行有两个非零元素。
  • 它们的列索引为 indices[0:1] = [0, 2] ,且存放的数据为 data[0] = 8data[1] = 2
  • 因此矩阵第 0 行的非零元素 csr[0][0] = 8csr[0][2] = 2

  • 对于矩阵第 4 行,同样我们需要先计算其非零元素列索引

    • indptr[4] = 3indptr[5] = 6 可知,第 4 行有3个非零元素。
  • 它们的列索引为 indices[3:5cla] = [2, 3,4] ,且存放的数据为 data[3] = 7data[4] = 1data[5] = 2
  • 因此矩阵第 4 行的非零元素 csr[4][2] = 7csr[4][3] = 1csr[4][4] = 2

.CSC - csc_matrix

Compressed Sparse Column Matrix 压缩稀疏列矩阵

  • csc_matrix是按列对矩阵进行压缩的

  • 通过 indices, indptrdata 来确定矩阵,可以对比CSR

  • data 表示矩阵中的非零数据

  • 对于第 i 列而言,该行中非零元素的行索引为indices[indptr[i]:indptr[i+1]]

  • 可以将 indptr 理解成利用其自身索引 i 来指向第 i 列元素的列索引

  • 根据[indptr[i]:indptr[i+1]],我就得到了该行中的非零元素个数,如

    • index[i] = 1index[i+1] = 1 ,则第 i 列的没有非零元素
  • index[j] = 4index[j+1] = 6 ,则第 j列的非零元素的行索引为 indices[4:6]

  • 得到了列索引、行索引,相应的数据存放在: data[indptr[i]:indptr[i+1]]

image-20221026172917714

  • 对于矩阵第 0 列,我们需要先得到其非零元素行索引

    • indptr[0] = 0indptr[1] = 1 可知,第 0列行有1个非零元素。
  • 它们的行索引为 indices[0:1] = [0] ,且存放的数据为 data[0] = 8
  • 因此矩阵第 0 行的非零元素 csc[0][0] = 8

  • 对于矩阵第 3 列,同样我们需要先计算其非零元素行索引

    • indptr[3] = 4indptr[4] = 6 可知,第 4 行有2个非零元素。
  • 它们的行索引为 indices[4:6] = [4, 6] ,且存放的数据为 data[4] = 1data[5] = 9
  • 因此矩阵第 i 行的非零元素 csr[4][3] = 1csr[6][3] = 9
C++