提问人:Keen-ameteur 提问时间:11/7/2023 更新时间:11/7/2023 访问量:34
在方格上为薛定谔算子生成稀疏矩阵
Generate sparse matrix for a schrodinger operator on square grid
问:
我正在尝试在 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 中实现第一部分总是会失败。
我应该提一下,我的编码技能是基本的,所以我希望能得到一些关于代码改进的明显反馈。
答:
2赞
der da
11/7/2023
#1
有了 with 和 from,您可以非常有效地创建稀疏矩阵。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
评论
0赞
hpaulj
11/8/2023
通常,构建样式输入数组的速度更快,内存效率更高,但由于此用户已经在迭代设置元素,因此这种方法是一个更容易的稀疏起点。coo
lil
评论