【问题标题】: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 2MATRIX 3 之间的区别?我们是否使用负整数作为间距?

谢谢

【问题讨论】:

  • 你想到什么语言/工具?
  • 我问的是一般理论。如果有帮助,C 会很好。

标签: algorithm matrix data-structures sparse-matrix


【解决方案1】:

看看The Wikipedia pageIA 向量(或者你称之为“行”)定义为:

数组 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" 的定义来完成解释吗?

    提前致谢,不胜感激!

    【讨论】:

      猜你喜欢
      • 2015-12-05
      • 2023-03-25
      • 1970-01-01
      • 2019-03-12
      • 2014-09-18
      • 2023-01-07
      • 2019-07-27
      • 2015-12-30
      • 2017-07-07
      相关资源
      最近更新 更多