重写几个矩阵运算以避免内存错误?

问题描述 投票:0回答:2

我的矩阵很大。 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产品上出现了内存错误。有没有一种方法可以重写此矩阵操作,或者更好的方法是,所有矩阵操作都可以避免发生内存错误?]

python numpy memory out-of-memory
2个回答
1
投票

[取决于您有多少内存剩余,您可以仅使用.astype(np.float32)之类的东西来减小矩阵的大小(例如,如果当前dtypenp.float64。]]

buildmatrix(N)在同一行中被调用两次(与transform相同)。如果结果是确定性的(您只想使用相同的结果),则尝试将其分配给变量,以便只需要调用一次。

这些技巧可能会略微减少内存配置文件,但可能不足或不足。我不确定是否可以通过某种身份简化计算。


0
投票

一个建议是使用稀疏矩阵。另外,如果可能,请使buildmatrix返回dtype np.complex64而不是np.complex128的矩阵。请参见下面的示例:

© www.soinside.com 2019 - 2024. All rights reserved.