python - 重写几个矩阵运算以避免内存错误?
问题描述
我有一个非常大的矩阵。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 产品中。有没有办法重写这个,或者更好的是,所有的矩阵运算来避免内存错误?
解决方案
一种建议是使用稀疏矩阵。另外,如果可能的话,让你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
为“稀疏版本”。
推荐阅读
- reactjs - 使用 React 的向导/工作流应用程序
- javascript - 使用 Vue.js 在 WebStorm 中进行调试
- c# - 使用 EPPlus 将背景图像添加到 Excel 不起作用
- python - webscrape 脚本输出数据 3 次。我做错了什么?
- docusignapi - 条件父标签签名选项卡
- angular - 如何从服务器端以角度呈现文件(图像)
- html - 可以在静态网站上使用 nodejs 进行表单提交吗?
- javascript - 使用 jQuery 删除没有特定类的 DOM 元素
- python - 动态更新最后一列标题 - 熊猫
- javascript - PeerJS 在 Chrome 中连接,但在其他浏览器中不连接