【问题标题】:Compressed Sparse Row (CSR): How do you store empty rows?压缩稀疏行 (CSR):如何存储空行?
【发布时间】:2017-05-03 23:08:39
【问题描述】:
在 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 2 和MATRIX 3 之间的区别?我们是否使用负整数作为间距?
谢谢
【问题讨论】:
标签:
algorithm
matrix
data-structures
sparse-matrix
【解决方案1】:
看看The Wikipedia page。 IA 向量(或者你称之为“行”)定义为:
数组 IA 的长度为 m + 1。它由以下递归定义定义:
- IA[0] = 0
- IA[i] = IA[i − 1] +(原始矩阵中第 (i − 1) 行的非零元素数)
- 因此,IA的前m个元素存储了M每行第一个非零元素的索引到A中,最后一个元素IA[m]存储了NNZ,即A中的元素个数,也可以这样认为的作为在矩阵 M 末尾之外的幻象行的第一个元素的 A 中的索引。从元素 A[IA[i]] 到 A[IA 读取原始矩阵的第 i 行的值[i + 1] - 1](包括两端),即从一行的开始到下一行开始之前的最后一个索引。
因此,在矩阵 1 中:
row = [0 1 2 3]
在矩阵 2 中:
row = [0 3 3 3]
在矩阵 3 中
row = [0 0 3 3]
【解决方案2】:
提供的答案几乎是一个很好的解释,但需要澄清一下:
前两个要点为IA 中的条目提供了明确的说明。
但是下一部分,
"因此,IA的第一个m元素将索引存储到M每行中第一个非零元素的A中,最后一个元素IA[m]存储NNZ,数字A 中的元素的个数,也可以认为是在矩阵M 末尾之外的幻象行的第一个元素在A 中的索引。原始矩阵的i-th row 的值是从元素中读取A[IA[i]] to A[IA[i + 1] − 1]
(包括两端),即从一行的开始到下一行开始之前的最后一个索引。”
很难解析,因为没有定义引用"IA", "m", "NNZ", "M", 和"A"。
"IA" 的长度是否等于 1 加上整个矩阵中非零元素的数量?我认为"A" 和"M" 指的是完整矩阵和稀疏矩阵,但是没有足够的信息来确定哪个是哪个。 "NNZ" 可能指的是整个矩阵中非零元素的数量。而“m”可能和"NNZ"一样。
您介意通过提供"IA", "m", "NNZ", "M" 和"A" 的定义来完成解释吗?
提前致谢,不胜感激!