如何有效地存储大型稀疏数组

时间:2014-07-12 23:09:16

标签: arrays matrix storage sparse-matrix

我正在将粒子追踪到3D格子中。每个晶格元素都标有对应于展开的3D阵列的索引

  S = x + WIDTH * (y + DEPTH * z)

我对从单元格S1到单元格S2的过渡感兴趣。得到的转移矩阵M(S1,S2)是稀疏填充的,因为粒子只能靠近细胞到达。不幸的是,使用几何上接近的展开的3D阵列单元的索引可能在它们的索引中具有很大的差异。例如,彼此重叠的单元格(比如z和z + 1)将使其索引偏移WIDTH * DEPTH。因此,如果我尝试累积得到的2D矩阵M(S1,S2),则S1和S2将是非常不同的,甚至面团细胞也是相邻的。这是一个重大问题,因为我无法使用通常的稀疏矩阵存储。

一开始我尝试以坐标格式存储矩阵:

  I , J VALUE

不幸的是,我需要循环整个索引集以找到正确的S1,S2并存储累积的M(S1,S2)。

异常稀疏的矩阵有一些底层结构,因此索引非常简单。然而,在这种情况下,我有一些麻烦,弄清楚如何索引我的细胞。

感谢您的帮助 提前谢谢你,

1 个答案:

答案 0 :(得分:1)

有几种方法。哪个最好取决于需要在矩阵上执行的操作。

一个好的通用目的是使用哈希表,其中键是索引元组,在你的情况下(i,j)。

如果相邻(在欧几里德意义上)矩阵元素必须是可发现的,那么备用策略是具有Morton Order键的平衡树。密钥(i,j)的Morton顺序值只是整数i和j,它们的比特是交错的。您应该很快看到索引2空间中的索引元组也接近于线性Morton顺序。

当然,如果你要一次构建矩阵,之后它是不可变的,那么你可以在数组而不是哈希表或平衡树中构建键值对,对它们进行排序(按字典顺序排列) (i,j)对Morton键进行线性对,然后用简单的二进制搜索进行读取。