当前位置: 首页 > 知识库问答 >
问题:

如何高效存储大型稀疏阵列

欧阳飞章
2023-03-14

我正在跟踪粒子到三维晶格中。每个晶格元素都有一个对应于展开的3D数组的索引

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

我对从S1单元到S2单元的过渡感兴趣。由此产生的过渡矩阵M(S1,S2)人口稀少,因为粒子只能在细胞附近到达。不幸的是,使用几何上接近的展开3D阵列单元的索引可能会在索引上有很大差异。例如,位于彼此顶部(例如z和z 1处)的单元格的索引将按宽度*深度移动。因此,如果我尝试累积得到的2D矩阵M(S1,S2),S1和S2将非常不同,即使细胞是相邻的。这是一个重要的问题,因为我不能使用通常的稀疏矩阵存储。

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

  I , J VALUE

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

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

谢谢你的帮助提前谢谢,

共有1个答案

颜鸿云
2023-03-14

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

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

如果相邻的(欧几里德意义上的)矩阵元素必须是可发现的,那么另一种策略是使用莫顿顺序键的平衡树。密钥(i,j)的莫顿阶值就是位交错的整数i和j。您应该很快就会看到,在索引2-空间中彼此接近的索引元组也以线性莫顿顺序接近。

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

 类似资料:
  • 问题内容: 我在用PyTables存储numpy csr_matrix时遇到问题。我收到此错误: 我的代码: 有任何想法吗? 谢谢 问题答案: 一个CSR矩阵可以从它的完全重建,和属性。这些只是常规的numpy数组,因此将它们作为3个单独的数组存储在pytables中,然后将它们传递回的构造函数应该没有问题。请参阅scipy文档。 编辑: Pietro的答案已指出该成员也应存储

  • 问题内容: (关于省时的稀疏数组存在一些问题,但我正在寻找内存效率。) 我需要一个相当于或哪些 只需设置一个比以前遇到的密钥大的密钥即可按需增长。(可以假定键为非负数。) 与大多数索引不是(即实际数据不是很稀疏时)的情况下的内存效率差不多。 当索引稀疏时,消耗的空间与非索引的数量成正比。 使用的内存少于(因为这会使键自动装箱并且可能不利用标量键类型)。 可以获取或设置摊销log(N)时间中的元素,

  • 我正在处理一个非常大的稀疏矩阵乘法(matmul)问题。作为一个例子,让我们说: > A是一个二进制(75 x 200,000)矩阵。它很稀疏,所以我使用csc进行存储。我需要执行以下matmul操作: B=A.转置()*A 输出将是大小为200Kx200K的稀疏对称矩阵。 不幸的是,B存储在我笔记本电脑上的RAM(或“核心”)中会变得太大。另一方面,我很幸运,因为B有一些属性可以解决这个问题。

  • 稀疏矩阵(Sparse Matrix) 注:压缩存储的矩阵可以分为特殊矩阵和稀疏矩阵。对于那些具有相同元素或零元素在矩阵中分布具有一定规律的矩阵,被称之为特殊矩阵。对于那些零元素数据远远多于非零元素数目,并且非零元素的分布没有规律的矩阵称之为稀疏矩阵。 1. 稀疏矩阵的概念 在矩阵中,若数值为0的元素数目远远多于非0元素的数目时,则称该矩阵为稀疏矩阵。与之相反,若非0元素数目占大多数时,则称该矩阵

  • 我正在实现一个稀疏矩阵类,使用映射向量来存储数据(映射表示矩阵的一行,其中键是列的索引,值是该位置的maitrix的值)我已经编写了计算行列式的函数,但我不知道是否有一种方法可以计算这种节省的时间(因为矩阵是稀疏的,大多数值为零)在这里我的实现: 这是类接口 我计算行列式的方式是什么?假设运算符()以这种方式重载 提前感谢您的帮助

  • 由于array1包含100多万个条目(即使其中70%是空/零条目),库文件(test.a)的大小相当大。 我知道使用哈希表只包含非空条目可以减少array1的大小,但这是否可以在不更改的情况下压缩或优化库文件(test.a)的大小? 由于已被其他库引用,因此对array1进行改造以使用其他实现可能不是解决我当前情况的方法。 这是对C语言中大型稀疏数组的压缩或大小优化的后续,基本上是在要求同样的事情