5

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 中的稀疏矩阵进行元素除法?

4

1 回答 1

8

逐元素除法的问题在于,如果你的矩阵都是稀疏的,那么你的结果中就会有很多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

感谢 florel 关于使用summaryand的建议merge

于 2012-09-29T04:44:15.750 回答