我试图在 SciPy 中生成一个稀疏矩阵来表示 $\mathbb{Z}^2$ 子网格上的薛定谔运算符。我最初尝试使用 NumPy 这样做,但遇到了内存分配问题。我想不出如何在不首先依赖 NumPy 的情况下实现这段代码。
为了澄清问题,我想生成一个 $N^2 imes N^2$ 对称矩阵 $H=A+D$,其中 $A$ 是 $N imes N$ 网格上的邻接,$D$ 是对角矩阵。我当前的实现(作为伪代码)大致如下
D = np.diag(arr)
A = numpy.zeros( (N**2,N**2) )
for i in range(N):
for j in range(N):
for k in range(N):
for l in range(N):
if( abs(i-k)+abs(j-l)=1 ):
A[i*N+j][k*N+l] =1
H = A+D
但是对于我的目的来说,这段代码在记忆方面失败了。有没有办法使用稀疏包来实现这种想法?我在实现有关 $A$ 的部分然后将其添加到 $D$ 时尤其遇到问题。我认为尝试在 NumPy 中实现第一部分总是会失败。
我应该提到,我的编码技能是基本的,所以我什至很感激有关代码改进的一些明显的反馈。
使用
lil_matrix
和 diags
中的 scipy.sparse
,您可以非常有效地创建稀疏矩阵。
import numpy as np
from scipy.sparse import lil_matrix, diags
arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
N = len(arr)
np_arr = np.array(arr * N)
D = diags(np_arr, 0, format="lil")
A = lil_matrix((N**2, N**2))
for i in range(N):
for j in range(N):
for k, l in [(i+1, j), (i-1, j), (i, j+1), (i, j-1)]:
if 0 <= k < N and 0 <= l < N:
A[i*N+j, k*N+l] = 1
A = A.tocsr() # makes operations on sparse matrices more efficient
H = A + D