【问题标题】:Create sparse matrix with diagonal blocks使用对角块创建稀疏矩阵
【发布时间】:2022-01-30 23:45:47
【问题描述】:

我有一个稀疏矩阵 A。如何有效地创建一个更大的稀疏矩阵,将 A 作为对角块?

例如,对于n = 2,我会得到矩阵

A, 0*A
0*A, A

例如,让我们说

from scipy.sparse import kron as spkron
from scipy.sparse import hstack, vstack
import numpy as np
A_dense = np.arange(9).reshape(3, 3)
A = spkron(A_dense, 2)
n = 2

我会怎么做这件事非常麻烦,就是迭代地添加所有元素,然后将每一行堆叠起来,然后堆叠到最终的矩阵:

zeros = A * 0
rows = {}
for i in range(n):
    rows[i] = [zeros] * n
    rows[i][i] = A

rows_stack =  {}
for i in range(n):
    rows_stack[i] = hstack([r for r in rows[i]])
stacked = vstack([r for r in rows_stack.values()])

【问题讨论】:

  • spare.hstackvstack 都使用 sparse.bmat 从块创建矩阵。 bmat 依次组合块的coo 属性以创建新的coo 矩阵。 block_diag 做同样的事情,但简化了一点,所以你不需要定义 0*A 块。我知道这些事情是因为我查看了源代码。 :)

标签: python scipy sparse-matrix


【解决方案1】:

在 scipy 中有一个专门的函数可以创建稀疏对角块矩阵。对于您的情况,您必须创建 A 并将其传递 n 次。 https://docs.scipy.org/doc/scipy/reference/generated/scipy.sparse.block_diag.html

from scipy.sparse import block_diag
block_diag((A, A))

【讨论】:

    猜你喜欢
    • 2012-01-10
    • 1970-01-01
    • 1970-01-01
    • 2015-07-22
    • 1970-01-01
    • 1970-01-01
    • 2018-01-19
    • 2016-01-13
    • 1970-01-01
    相关资源
    最近更新 更多