在 Python 中创建任意维度的稀疏矩阵 3
Create arbitrary dimension sparse matrix in Python 3
所以我使用 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
很大时(因为这是求解微分方程,这是必要的),它会花费很多时间。有更有效的方法吗?
这里没有计时(我没有性能保证),但对我来说最自然的方法(没有太多使用 kronecker 的经验)是 scipy 的 block_diag 虽然我总是想知道我是否正确使用它(在这种情况下:列表理解):
代码
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]]
所以我使用 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
很大时(因为这是求解微分方程,这是必要的),它会花费很多时间。有更有效的方法吗?
这里没有计时(我没有性能保证),但对我来说最自然的方法(没有太多使用 kronecker 的经验)是 scipy 的 block_diag 虽然我总是想知道我是否正确使用它(在这种情况下:列表理解):
代码
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]]