将稀疏矩阵分块为稀疏矩阵
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.ij
是 16x12
。
我正在为 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))
)
给定一个稀疏矩阵 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
。
我正在为 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))
)