我的矩阵很大。 buildmatrix是一个N x N矩阵。因此sumHamiltonian是一个N ^ 2 x N ^ 2矩阵。然后transform(N)是一个N ^ 2×N(N-1)/ 2矩阵。 (因此,得到的shortHamiltonian(N)是一个N(N-1)/ 2 x N(N-1)/ 2矩阵)。矩阵条目也是复数。
如果N = 200,则出现内存错误。有没有办法重写:
def sumHamiltonian(N):
return 0.5*(np.kron(buildmatrix(N),np.identity(N))+np.kron(np.identity(N),buildmatrix(N)))
def shortHamiltonian(N):
return np.matmul(np.transpose(transform(N)),np.matmul(sumHamiltonian(N),transform(N)))
减少内存?
我已经看到了一些减少矩阵乘法(Python/Numpy MemoryError)的内存的方法,这很有用,但是在kronecker产品上出现了内存错误。有没有一种方法可以重写此矩阵操作,或者更好的方法是,所有矩阵操作都可以避免发生内存错误?]
[取决于您有多少内存剩余,您可以仅使用.astype(np.float32)
之类的东西来减小矩阵的大小(例如,如果当前dtype
为np.float64
。]]
buildmatrix(N)
在同一行中被调用两次(与transform
相同)。如果结果是确定性的(您只想使用相同的结果),则尝试将其分配给变量,以便只需要调用一次。
这些技巧可能会略微减少内存配置文件,但可能不足或不足。我不确定是否可以通过某种身份简化计算。
一个建议是使用稀疏矩阵。另外,如果可能,请使buildmatrix
返回dtype np.complex64
而不是np.complex128
的矩阵。请参见下面的示例: