首页 > 解决方案 > 重写几个矩阵运算以避免内存错误?

问题描述

我有一个非常大的矩阵。buildmatrix 是一个 N 乘 N 矩阵。所以 sumHamiltonian 是一个 N^2 × N^2 矩阵。那么 transform(N) 是一个 N^2 乘 N(N-1)/2 矩阵。(因此得到的 shortHamiltonian(N) 是 N(N-1)/2 乘 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 产品中。有没有办法重写这个,或者更好的是,所有的矩阵运算来避免内存错误?

标签: pythonnumpymemoryout-of-memory

解决方案


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

from scipy import sparse


def buildmatrix(N):
    return (np.random.rand(N, N) + np.random.rand(N, N) * 1j).astype(np.complex64)

N = 100

m = buildmatrix(N)
I = np.identity(N)
sumHamiltonian = 0.5 * (np.kron(m, I) + np.kron(I, m))
print(f'{sumHamiltonian.nbytes * 1e-9} GB')
#1.6 GB

m_s = sparse.csr_matrix(m)
I_s = sparse.identity(N)
sumHamiltonian_s = 0.5 * (sparse.kron(m_s, I_s) + sparse.kron(I_s, m_s))
print(f'{sumHamiltonian_s.data.nbytes * 1e-6} MB')
#31.84 MB

#np.all(sumHamiltonian == sumHamiltonian_s)
#True

同样尝试将您的转换shortHamiltonian为“稀疏版本”。


推荐阅读