代码之家  ›  专栏  ›  技术社区  ›  Clayton Stanley

R中稀疏矩阵的向量化元素除法

  •  5
  • Clayton Stanley  · 技术社区  · 12 年前

    R中的A/B对矩阵执行逐元素除法。

    然而,如果我从矩阵包生成一个稀疏矩阵,并尝试划分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 回复  |  直到 12 年前
        1
  •  8
  •   Gabor Csardi    12 年前

    按元素划分的问题是,如果矩阵都是稀疏的,那么你会有很多 Inf NaN 结果,这些使其致密。这就是为什么你会出现内存不足的错误。

    如果要替换 Inf公司 硝酸钠 如果结果为零,那么解决方案相对容易,您只需获得 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