【发布时间】:2014-11-30 18:11:22
【问题描述】:
对于一个项目,我构建了一个构建大型矩阵的程序。
def ExpandSparse(LNew):
SpId = ssp.csr_matrix(np.identity(MS))
Sz = MS**LNew
HNew = ssp.csr_matrix((Sz,Sz))
Bulk = dict()
for i in range(LNew-1):
for j in range(LNew-1):
if i == j:
Bulk[(i,j)]=H2
else:
Bulk[(i,j)]=SpId
Ha = ssp.csr_matrix((8,8))
try:
for i in range(LNew-1):
for j in range(LNew-2):
if j < 1:
Ha = ssp.csr_matrix(ssp.kron(Bulk[(i,j)],Bulk[(i,j+1)]))
else:
Ha = ssp.csr_matrix(ssp.kron(Ha,Bulk[(i,j+1)]))
HNew = HNew + Ha
except MemoryError:
print('The matrix you tried to build requires too much memory space.')
return
return HNew
这可以完成工作,但效果不如我预期的那样好。问题是它不允许非常大的矩阵。当LNew 大于 13 时,我会收到 MemoryError。我对 numpy 的经验表明,在我收到此错误之前,我应该能够将 LNew 提高到 18 或 19。这是否与我的代码有关,或者与 scipy.sparse.kron() 处理这些矩阵的方式有关?
另一个可能很重要的注意事项是我使用的是 Windows 而不是 Linux。
【问题讨论】:
-
您能否提供一个独立的示例,其中定义了所有变量?比如
MS的值是多少? -
MS 在这种情况下是 2。H2 是一个 4 x 4 矩阵,定义为:
H2 = ssp.csr_matrix(np.array([[0.25,0.0,0.0,0.0],[0.0,-0.25,0.5,0.0],[0.0,0.5,-0.25,0.0],[0.0,0.0,0.0,0.25]]))其中 ssp 是 scipy.sparse -
你可以构造的最大
Ha的大小是多少?我在考虑形状,更重要的是非零的数量。粗略地说,具有N非零项的稀疏矩阵会将数据存储在 3 个数组(N,)long 中(其中 2 个是 int dtype)。 -
我能构造的最大
Ha是8192 x 8192,其中存储了55496个CSR格式的元素。所以正如我提到的,奇怪的是,使用 numpy 我可以计算一个 4096 x 4096 的密集矩阵,但在这里我不能超过一个包含 55496 个非零元素的稀疏矩阵。