在方格上为薛定谔算子生成稀疏矩阵

Generate sparse matrix for a schrodinger operator on square grid

提问人:Keen-ameteur 提问时间:11/7/2023 更新时间:11/7/2023 访问量:34

问:

我正在尝试在 SciPy 中生成一个稀疏矩阵来表示 $\mathbb{Z}^2$ 子网格上的薛定谔算子。我最初尝试使用 NumPy 执行此操作,但我遇到了内存分配问题。我想不出如何在不首先依赖 NumPy 的情况下实现此代码。

为了澄清这个问题,我想生成一个 $N^2\times N^2$ 对称矩阵 $H=A+D$,其中 $A$ 是 $N\times 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 数学 稀疏矩阵

评论

0赞 Simon Goater 11/7/2023
也许使用一个函数而不是将整个东西存储在内存中。类似于 AdjMat(x, y, N) then j = x % N, i = x / N, k = y % N, l = y / N, then if( abs(i-k)+abs(j-l)=1 ): return 1 else return 0.
0赞 President James K. Polk 11/8/2023
Stack Overflow 不处理 TeX 的任何变体,因此除非它恰好是关于 TeX 的问题,否则您不应该使用它。

答:

2赞 der da 11/7/2023 #1

有了 with 和 from,您可以非常有效地创建稀疏矩阵。lil_matrixdiagsscipy.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

评论

0赞 hpaulj 11/8/2023
通常,构建样式输入数组的速度更快,内存效率更高,但由于此用户已经在迭代设置元素,因此这种方法是一个更容易的稀疏起点。coolil