将稀疏矩阵块作为稀疏矩阵
Posted
技术标签:
【中文标题】将稀疏矩阵块作为稀疏矩阵【英文标题】:Block sparse matrices as sparse matrices 【发布时间】:2018-01-19 04:32:58 【问题描述】:给定一个稀疏矩阵M
,即32x24
,我正在尝试创建一个更大的这种形式的稀疏矩阵:
A = [[O(32),M],[t(M),O(24)]]
这里O(n)
是一个维度为nxn
的零稀疏矩阵。
M
本身就是一个块矩阵:
M = [[m.aa,m.ab],[m.ba,m.bb]]
其中m.ij
是16x12
。
我将 Matrix
包用于 sparsematrix
和 blockmatrix
用于 blockmatrix
。我遇到的一个问题是use.as.blockmatrix=FALSE
参数,它适用于普通块矩阵,但似乎不适用于块稀疏矩阵。我不能对有问题的块矩阵进行转置,这使得A
的构造变得困难。
这是我生成m.ij
的方式:
m.aa<-rsparsematrix(
#dimensions:
nrow=16,ncol=12,
nnz=20,
rand.x=function(x) 1 )
m.ab<-rsparsematrix(
#dimensions:
nrow=16,ncol=12,
nnz=10,
rand.x=function(x) 1 )
m.ba<-rsparsematrix(
nrow=16,ncol=12,
nnz=0,
rand.x=function(x) 1 )
m.bb<-m.aa
M<-blockmatrix(dim=c(2,2),names=c("maa","mba","mab","mbb"),
maa=m.aa,mab=m.ab,mba=m.ba,mbb=m.bb,
use.as.blockmatrix=FALSE)
但是attr(M,"class")
显示M
仍然是blockmatrix
,即使我有use.as.blockmatrix=FALSE
。
我可以创建O(32)
和O(24)
,但是t(M)
给了我错误消息argument is not a matrix
,所以我不能将它用于块A(2,1)
:(
A
可以用类似的东西构造:
Mt<-t(M)
O32<-rsparsematrix(nrow=32,ncol=32,nnz=0)
O24<-rsparsematrix(nrow=24,ncol=24,nnz=0)
A<-blockmatrix(dim=c(2,2),names=c("RR","BR","RB","BB"), RR=O32,RB=M,BR=Mt,BB=O24)
【问题讨论】:
mij.rowCount
和 mij.colCount
是什么?
M <- cBind(rBind(m.aa,m.ba),rBind(m.ab,m.bb))
工作吗?
@BenBolker 已修复,关于那些常量名称。 rbind,cbind
似乎适用于 M
,但 A
需要一个技巧,因为尺寸不匹配。
【参考方案1】:
这可能有点尴尬,但您可以使用rBind()
、cBind()
和Matrix(0,...)
自己组合适当的块,而不是使用blockmatrix
:
M <- cBind(rBind(m.aa,m.ba),rBind(m.ab,m.bb))
A <- rBind(
cBind(Matrix(0,32,32), M ),
cBind(t(M), Matrix(0,24,24))
)
【讨论】:
以上是关于将稀疏矩阵块作为稀疏矩阵的主要内容,如果未能解决你的问题,请参考以下文章
使用 scipy.sparse.bmat 从子块创建非常大的稀疏矩阵时出错