代码之家  ›  专栏  ›  技术社区  ›  Alvaro Martínez Rubio

在Python 3中创建任意维稀疏矩阵

  •  0
  • Alvaro Martínez Rubio  · 技术社区  · 7 年前

    所以我使用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 是大的(这是必要的,因为这是为了解一个微分方程)。有没有更有效的方法?

    1 回复  |  直到 7 年前
        1
  •  2
  •   sascha    7 年前

    这里没有计时(我没有性能保证),但对我来说,最自然的方法(我对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]]