为方形网格上的薛定谔算子生成稀疏矩阵

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

我试图在 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 中实现第一部分总是会失败。

我应该提到,我的编码技能是基本的,所以我什至很感激有关代码改进的一些明显的反馈。

python math sparse-matrix
1个回答
0
投票

使用

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
© www.soinside.com 2019 - 2024. All rights reserved.