具有快速行和列访问的稀疏矩阵格式

计算科学 线性代数 图论
2021-12-05 20:30:11

对于一般的非对称稀疏矩阵,是否有一种有效的存储格式,可以在其中找到给定行或列中的所有非零条目O(d)时间?(d是任何行或列中非零条目的最大数量。)

如果我存储一个m×n稀疏矩阵A在压缩行或 ellpack 格式中,我可以在给定行中找到所有非零条目O(d)时间,但在给定列中查找所有非零条目需要O(m). 当然,我可以存储A以压缩列格式,在这种情况下,列访问将采取O(d)但行访问需要O(n).

一种直截了当的方法是为同一个矩阵存储压缩行和列这两种格式,这当然需要双倍的内存。一个人能做得更好吗?

我能想到的最好的方法:对于方阵,可以将其存储为结构对称矩阵。如果要查找 j 列中的所有条目,则改为查找 j 行中的所有条目,然后删除多余的条目。

1个回答

您可以像往常一样以行压缩稀疏格式存储矩阵。然后对于每一列,存储稀疏模式中存在的条目。如果您需要列的条目,您可以从第二个数据结构中找出存在哪些条目,然后您可以从存储矩阵的逐行(正常)数据结构中获取值。

对于列式存储,这实际上是矩阵的每个条目一个整数(除了行存储的每个条目一个整数加上每个条目一个浮点数)。对于列或行条目使用 32 位整数,对于数字使用 64 位双精度,这给出:

  • 对于常规的逐行数据存储方案,每个条目 12 个字节
  • 如果您还想保留按列的信息,则每个条目 16 个字节。

访问列中的所有条目需要遍历按列数据结构中的列,即O(d),并且对于您找到的每个条目,您需要以逐行格式查找它以获取值,这将花费您O(logd)对于每个条目。总的来说,这使得O(dlogd)访问列的所有元素。