【问题标题】:Python: How do I create a diagonal matrix with block matrices as diagonals [closed]Python:如何创建以块矩阵为对角线的对角矩阵 [关闭]
【发布时间】:2018-05-09 22:24:52
【问题描述】:

我需要创建一个如图所示形式的矩阵,这是一个 9x9 矩阵,但我想为给定 N 值的 NxN 矩阵创建它。

是否可以通过首先定义两个块矩阵来创建它,第一个块矩阵沿对角线重复,第二个块矩阵以 1 和 -1 的对角偏移重复?

这显示了我需要的最终矩阵的图片:

【问题讨论】:

  • SO 不是一个零努力地转储需求并期望有人为您完成工作的好地方。
  • 是的,有可能。我假设您的问题已得到解答。
  • 创建稀疏矩阵的原始方法使用coo 输入样式。还有几种对角线样式,还有一个块矩阵样式。
  • 另一种方法:定义子块:a = np.array([[-4,1,0],[1, -4,1],[0,1,4]]); b=np.eye(3,dtype=int); c=np.zeros((3,3),int),并使用新的block 函数将它们连接起来:M = np.block([[a,b,c], [b,a,b], [c,b,a]])

标签: python python-3.x numpy matrix scipy


【解决方案1】:

我创建了一个 function 来满足你的需求,尽管你自己没有尝试,因为我认为这是一个很酷的问题。


function 使用broadcasting 沿diagonals 分配3x3 块。

def matrix(n):
    a = np.zeros((n,n), np.int8)
    for d in range(0, int(n/3)+4, 3):
        a[d:d+3, d:d+3] = np.array([[-4, 1, 0], [1, -4, 1], [0, 1, -4]])
    for d in range(0, int(n/3)+3, 3):
        a[d:d+3, d+3:d+6] = np.array([[1, 0, 0], [0, 1, 0], [0, 0, 1]])
        a[d+3:d+6, d:d+3] = np.array([[1, 0, 0], [0, 1, 0], [0, 0, 1]])
    return a

还有一个测试:

>>> matrix(9)
array([[-4,  1,  0,  1,  0,  0,  0,  0,  0],
       [ 1, -4,  1,  0,  1,  0,  0,  0,  0],
       [ 0,  1, -4,  0,  0,  1,  0,  0,  0],
       [ 1,  0,  0, -4,  1,  0,  1,  0,  0],
       [ 0,  1,  0,  1, -4,  1,  0,  1,  0],
       [ 0,  0,  1,  0,  1, -4,  0,  0,  1],
       [ 0,  0,  0,  1,  0,  0, -4,  1,  0],
       [ 0,  0,  0,  0,  1,  0,  1, -4,  1],
       [ 0,  0,  0,  0,  0,  1,  0,  1, -4]], dtype=int8)

为了证明它有效,我用matplotlib 绘制了结果并得到:

【讨论】:

  • 你能解释一下程序吗?
  • 我可以使用 scipy 中的稀疏矩阵函数之一来做到这一点吗?你能帮我解决这个问题吗?
  • @AzlaanMustafaSamad 它通过循环对角线并将您的模式应用于matrix3x3 段来工作。如果您遵循代码,您应该能够看到发生了什么。我不熟悉sparsematrixfunctions,所以我对此无能为力,无论如何你应该针对这个特定要求提出一个新问题。至于这个,请accept我的回答(grey-->green在回答旁边打勾)表明它已经解决了你的问题。谢谢!
猜你喜欢
  • 2019-03-15
  • 1970-01-01
  • 2019-05-21
  • 1970-01-01
  • 1970-01-01
  • 2011-08-16
  • 1970-01-01
  • 2015-05-21
  • 2021-12-22
相关资源
最近更新 更多