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中的稀疏矩阵进行逐元素划分?
答案 0 :(得分:6)
元素划分的问题在于,如果你的矩阵都是稀疏的,那么结果中会有很多Inf
和NaN
,这些会使它变得密集。这就是你得到内存不足错误的原因。
如果要在结果中用零替换Inf
和NaN
,那么解决方案相对简单,您只需获取两个矩阵的summary()
并使用索引和值直接。
您需要将A
和B
索引向量限制在其交叉点并对其执行除法。要获得索引对的交集,可以使用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关于使用summary
和merge
的建议。