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

时间:2012-09-29 04:01:36

标签: 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
> 

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

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

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

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

1 个答案:

答案 0 :(得分:6)

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

如果要在结果中用零替换InfNaN,那么解决方案相对简单,您只需获取两个矩阵的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

感谢flodel关于使用summarymerge的建议。