【发布时间】: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.hstack和vstack都使用sparse.bmat从块创建矩阵。bmat依次组合块的coo属性以创建新的coo矩阵。block_diag做同样的事情,但简化了一点,所以你不需要定义0*A块。我知道这些事情是因为我查看了源代码。 :)
标签: python scipy sparse-matrix