将稀疏矩阵分块为稀疏矩阵

Block sparse matrices as sparse matrices

给定一个稀疏矩阵 M,即 32x24 我正在尝试创建一个更大的这种形式的稀疏矩阵:

A = [[O(32),M],[t(M),O(24)]]

这里O(n)是一个维度为nxn的零稀疏矩阵。

M本身就是分块矩阵:

M = [[m.aa,m.ab],[m.ba,m.bb]]

其中 m.ij16x12

我正在为 sparsematrix 使用 Matrix 包,为 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)

这可能有点尴尬,但您可以使用 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))
)