存储和读取n维稀疏矩阵

时间:2019-05-15 21:36:28

标签: algorithm matrix sparse-matrix

Yale format上的Wikipedia页面上用于存储稀疏矩阵的页面涵盖了2D矩阵,但是高维呢?是否有诸如Yale格式(或的扩展名)之类的算法可以存储n> 2维稀疏矩阵?—那样,我的意思是一种以某种压缩方式存储的算法,因为您当然可以存储原始矩阵。

对该主题的大多数搜索似乎都是针对特定的语言实现的,这些对我来说毫无用处,因为我正在寻找一种适应性强的算法。

1 个答案:

答案 0 :(得分:0)

我们可以想象两个极端:

  • 在一种极端情况下,您假设很大一部分元素为非零,因此只存储每个元素的值(不针对稀疏性进行优化),不需要存储有关元素位置的任何其他信息,并得出 mn 的总大小。
  • 在另一个极端,您假设一小部分元素为非零元素,因此您仅存储非零元素,但是现在还需要存储其位置(行和列),并且总大小为3‌ x (其中 x 是非零值的数量)。

Yale格式是这两者之间的折衷,我们假设非零元素的数量大于行数 1 ,但比元素总数小;因此我们为每行存储一个指针 2 ,然后将每个元素的值和位置存储在其行中,总大小为 m + 2‌ x

在两个以上的维度上,您可以继续做出相同的折衷。您只需要选择正确的维度或维度的正确组合,以使非零元素的数量小于行/超行/等的数量。

例如,对于由( i 索引的 m × n × p 数组j k ),您有两个妥协选项: 3

  • 如果期望非零元素的数量多于 mn 的一小部分,但比 mnp 小得多,则对于每个 i j ,您可以存储指向具有 i j 的元素的一维“切片”的指针。对于该片中的每个非零元素,您将存储其值及其 k ,总大小为 mn + 2‌ x
  • 如果期望非零元素的数量大于 m 的一小部分,但比 mn 小得多,则对于每个 i ,您可以存储指向具有该 i 的元素的二维“切片”的指针。对于该切片中的每个非零元素,您将存储其值,其 j 和其 k ,总大小为 m + 3‌ < em> x

更广泛地说,一个 d 维数组将具有 d -1折衷选项。 。 。或总共2 d 选项,如果您分别计算每个可能的尺寸选择。


注释:

  1. 我在这里写“行”,但是您也可以按列执行相同的操作。
  2. 在严格意义上不一定是“指针”;您可以只存储先前所有行中所有非零元素的总数。
  3. 不计算您可以选择使用不同尺寸的事实;您可以在行或列上使用耶鲁格式,因此可以在任何尺寸选择上使用这些选项。