所以我使用Python 3创建了一个
形式的矩阵L=[B 0 0
0 B 0
0 0 B]
,其中
B=[4 -1 0
-1 4 -1
0 -1 4]
但是我没有重复B
三次,而是想N
次(取决于输入)。到目前为止,我的镜头是以下
import numpy as np
import scipy.sparse as sp
one=np.ones(N)
four=4*np.ones(N)
data = np.array([-one, four, -one])
diags = np.array([-1,0, 1])
B=sp.spdiags(data, diags, N, N).toarray() # Create matrix B
L=np.kron(np.eye(N), B)
然而,当N
很大时需要花费很多时间(这是必要的,因为这是解决微分方程)。有没有更有效的方法来做到这一点?
答案 0 :(得分:2)
这里没有时间(我没有性能保证),但对我来说,最自然的方法(对kronecker没有多少经验)将是scipy的block_diag虽然我总是想知道我是否正确使用它(在这种情况下:list-comprehension):
import numpy as np
import scipy.sparse as sp
N = 2
B = np.array([[4,-1,0],[-1,4,-1],[0,-1,4]])
L = sp.block_diag([B for i in range(N)])
print(L.todense())
[[ 4 -1 0 0 0 0]
[-1 4 -1 0 0 0]
[ 0 -1 4 0 0 0]
[ 0 0 0 4 -1 0]
[ 0 0 0 -1 4 -1]
[ 0 0 0 0 -1 4]]