我正在使用scipy来生成一个稀疏的有限差分矩阵。我最初是从块矩阵构造它,然后编辑对角线以考虑边界条件。得到的稀疏矩阵属于BSR类型。我发现,如果我将该矩阵转换为稠密矩阵,然后再使用
如果我检查这个矩阵的稀疏性,我会看到以下内容:
我怀疑发生这种情况的原因是我使用了 sparse.kron 函数构建矩阵,但我的问题是是否有一种方法可以在不先转换为密集矩阵的情况下得到较小的稀疏矩阵,例如,如果我最终想要模拟一个非常大的域。
scipy.sparse.BSR_matrix
函数将其转换回稀疏矩阵,则会得到比之前更稀疏的矩阵。以下是我用来生成矩阵的代码:size = (4,4)
xDiff = np.zeros((size[0]+1,size[0]))
ix,jx = np.indices(xDiff.shape)
xDiff[ix==jx] = 1
xDiff[ix==jx+1] = -1
yDiff = np.zeros((size[1]+1,size[1]))
iy,jy = np.indices(yDiff.shape)
yDiff[iy==jy] = 1
yDiff[iy==jy+1] = -1
Ax = sp.sparse.dia_matrix(-np.matmul(np.transpose(xDiff),xDiff))
Ay = sp.sparse.dia_matrix(-np.matmul(np.transpose(yDiff),yDiff))
lap = sp.sparse.kron(sp.sparse.eye(size[1]),Ax) + sp.sparse.kron(Ay,sp.sparse.eye(size[0]))
#set up boundary conditions
BC_diag = np.array([2]+[1]*(size[0]-2)+[2]+([1]+[0]*(size[0]-2)+[1])*(size[1]-2)+[2]+[1]*(size[0]-2)+[2])
lap += sp.sparse.diags(BC_diag)
如果我检查这个矩阵的稀疏性,我会看到以下内容:
lap
<16x16 sparse matrix of type '<class 'numpy.float64'>'
with 160 stored elements (blocksize = 4x4) in Block Sparse Row format>
然而,如果我将其转换为密集矩阵,然后再转换回相同的稀疏格式,我会看到一个更稀疏的矩阵:
sp.sparse.bsr_matrix(lap.todense())
<16x16 sparse matrix of type '<class 'numpy.float64'>'
with 64 stored elements (blocksize = 1x1) in Block Sparse Row format>
我怀疑发生这种情况的原因是我使用了 sparse.kron 函数构建矩阵,但我的问题是是否有一种方法可以在不先转换为密集矩阵的情况下得到较小的稀疏矩阵,例如,如果我最终想要模拟一个非常大的域。
lap.tocsr()
是否会做同样的事情。我没有太多使用BSR,但我认为它将块存储为密集数组。 - hpaulj