压缩稀疏行 (CSR):如何存储空行?

Ste*_*sky 7 algorithm matrix sparse-matrix data-structures

你如何在 CSR 中表示空行?

假设我们有以下矩阵:

* MATRIX 1 *
a 0 0
0 b 0
0 0 c

val = [ a b c ]
col = [ 0 1 2 ]
row = [ 0 1 2 ] <- makes sense!

—————————————————————   

* MATRIX 2 *
a b c
0 0 0
0 0 0

val = [ a b c ]
col = [ 0 1 2 ]
row = [ 0 ] <— makes sense…? but how about…

—————————————————————

* MATRIX 3 *
0 0 0
a b c
0 0 0

val = [ a b c ]
col = [ 0 1 2 ]
row = [ 0 ] <— wait… how do we differentiate between MATRIX 2 and MATRIX 3?
Run Code Online (Sandbox Code Playgroud)

MATRIX 1是直观的,但是我们如何代表之间的差异MATRIX 2MATRIX 3?我们是否使用负整数来表示间距?

谢谢

小智 8

看看维基百科页面。该IA载体(或你叫它“行”),被定义为:

数组 IA 的长度为 m + 1。它由以下递归定义定义:

  • IA[0] = 0
  • IA[i] = IA[i ? 1] +(原始矩阵中第 (i ? 1) 行上的非零元素数)
  • 因此,IA的前m个元素存储M的每一行第一个非零元素的A的索引,最后一个元素IA[m]存储A中元素的个数NNZ,也可以认为是在矩阵 M 末尾的幻像行的第一个元素的 A 中的索引。原始矩阵的第 i 行的值从元素 A[IA[i]] 到 A[IA[i + 1] ? 1](包括两端),即从一行的开始到下一行开始之前的最后一个索引。

因此,在矩阵 1 中:

row = [0 1 2 3]

在矩阵 2 中:

row = [0 3 3 3]

在矩阵 3

row = [0 0 3 3]