对于一个项目,我构建了一个构建大型矩阵的程序。
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。
答案 0 :(得分:0)
在对scipy.sparse.kron()
函数的工作进行了一些阅读之后,我注意到你可以输入第三个名为format的术语。默认设置为None,但是当它被置于'csr'或其他支持的格式时,它将仅使用稀疏格式使其更高效,现在对我来说它可以构建一个2097152 x 2097152矩阵。这里LNew
是21。