将稀疏矩阵块作为稀疏矩阵

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.ij16x12

我将 Matrix 包用于 sparsematrixblockmatrix 用于 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.rowCountmij.colCount 是什么? M &lt;- 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 稀疏矩阵作为 DataFrame 列

如何从 scipy 稀疏块矩阵中取回块?

来自密集的Tensorflow的稀疏矩阵

使用 scipy.sparse.bmat 从子块创建非常大的稀疏矩阵时出错

将稀疏矩阵与 sklearn Affinity Propagation 结合使用

Numba 中的稀疏矩阵