R中稀疏矩阵的向量化元素划分

Cla*_*ley 5 r vectorization sparse-matrix

R中的A/B对矩阵执行逐元素划分.

但是,如果我从Matrix包中生成一个稀疏矩阵,并试图划分A/B,我会收到此错误:

> class(N)
[1] "dgCMatrix"
attr(,"package")
[1] "Matrix"
> N/N
Error in asMethod(object) : 
  Cholmod error 'problem too large' at file ../Core/cholmod_dense.c, line 105
> 
Run Code Online (Sandbox Code Playgroud)

有趣.当稀疏矩阵的总大小很小时,我得到这样的行为:

> m <- sparseMatrix(i=c(1,2,1,3), j=c(1,1,3,3), x=c(1,2,1,4))
> m/m
3 x 3 Matrix of class "dgeMatrix"
     [,1] [,2] [,3]
[1,]    1  NaN    1
[2,]    1  NaN  NaN
[3,]  NaN  NaN    1
> 
Run Code Online (Sandbox Code Playgroud)

但是当它的大小适中(~20000个元素)时,我得到了Cholmod错误.

是否有一种变通方法或更合适的方法对R中的稀疏矩阵进行逐元素划分?

Gab*_*rdi 7

元素划分的问题在于,如果你的矩阵都是稀疏的,那么你将拥有很多Inf并且NaN在结果中,这些使它变得密集.这就是你得到内存不足错误的原因.

如果要替换Inf,并NaN与结果为零,那么解决的办法是比较容易的,你只得到了summary()两个矩阵的和直接的指标和值工作.

您需要将向量AB索引向量限制到它们的交集并对其执行除法.要获得索引对的交集,可以使用merge().

这是一个快速而肮脏的实现:

# Some example data
A <- sparseMatrix(i=c(1,1,2,3), j=c(1,3,1,3), x=c(1,1,2,3))
B <- sparseMatrix(i=c(3,2,1), j=c(3,2,1), x=c(3,2,1))

sdiv <- function(X, Y, names=dimnames(X)) {
  sX <- summary(X)
  sY <- summary(Y)
  sRes <- merge(sX, sY, by=c("i", "j"))
  sparseMatrix(i=sRes[,1], j=sRes[,2], x=sRes[,3]/sRes[,4],
               dimnames=names)
}

sdiv(A, B)
# 3 x 3 sparse Matrix of class "dgCMatrix"
#           
# [1,] 1 . .
# [2,] . . .
# [3,] . . 1
Run Code Online (Sandbox Code Playgroud)

感谢flodel关于使用summary和的建议merge.

  • +1 - 但如果你使用“summary”和“merge”,这可能会短得多 (2认同)