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

人气:1,076 发布:2022-10-16 标签: data-structures algorithm matrix sparse-matrix

问题描述

如何在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?

MATRIX 1是直观的,但是我们如何表示MATRIX 2MATRIX 3之间的区别呢?我们是否使用负整数作为间距?

谢谢

推荐答案

查看The Wikipedia page。IA向量(或您称之为行)定义为:

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

IA[0]=0 IA[i]=IA[i−1]+(原始矩阵第(i−1)行的非零元素数) 因此,IA的前m个元素将索引存储到M的每行中的第一个非零元素的A中,而最后的元素IA[m]存储A中的元素的数目Nnz,其也可以被认为是恰好在矩阵M的末尾之后的幻象行的第一个元素在A中的索引。从元素A[IA[i]]到A[IA[i+1]−1](包括两端)读取原始矩阵的第i行的值,即从一行的开始到下一行开始之前的最后一个索引。

因此,在矩阵1中:

row = [0 1 2 3]

在矩阵2中:

row = [0 3 3 3]

在矩阵3中

row = [0 0 3 3]

435