How to convert a sparse matrix into a matrix of index and value of non-zero element

前端 未结 3 688
青春惊慌失措
青春惊慌失措 2020-12-11 01:19

We can construct a sparse matrix from an index and value of non-zero element with the sparseMatrix or spMatrix. Is there any function convert a spa

相关标签:
3条回答
  • 2020-12-11 01:47

    Use which with arr.ind:

    idx <- which(A != 0, arr.ind=TRUE)
    cbind(idx, A[idx])
    #      [,1] [,2] [,3]
    # [1,]    1    1    1
    # [2,]    3    3    2
    # [3,]    5    4    3
    
    0 讨论(0)
  • summary(A)
    # 5 x 4 sparse Matrix of class "dgCMatrix", with 3 entries 
    #   i j x
    # 1 1 1 1
    # 2 3 3 2
    # 3 5 4 3
    

    which you can easily pass to as.data.frame or as.matrix:


    sparseToVector <- function(x)as.matrix(summary(x))
    B <- sparseToVector(A)
    ## test case:
    identical(B,cbind(i,j,x))
    # [1] TRUE
    
    0 讨论(0)
  • 2020-12-11 02:13

    Your matrix A is in the sparse compressed Format (class dgCMatrix). You can coerce it into the non-compressed sparse format by

    A.nc <- as (A, "dgTMatrix")
    

    Or, you could have specified giveCsparse = TRUE in the sparseMatrix call.

    The triplet form of dgTMatrix basically contains all you're looking for in slots i, j, and x, just i and j indexing is done with 0-based offsets:

    > str (A.nc)
    Formal class 'dgTMatrix' [package "Matrix"] with 6 slots
      ..@ i       : int [1:3] 0 2 4
      ..@ j       : int [1:3] 0 2 3
      ..@ Dim     : int [1:2] 5 4
      ..@ Dimnames:List of 2
      .. ..$ : NULL
      .. ..$ : NULL
      ..@ x       : num [1:3] 1 2 3
      ..@ factors : list()
    
    > cbind (i = A.nc@i + 1, j = A.nc@j + 1, x = A.nc@x)
         i j x
    [1,] 1 1 1
    [2,] 3 3 2
    [3,] 5 4 3
    > all (cbind (i = A.nc@i + 1, j = A.nc@j + 1, x = A.nc@x) == cbind (i, j, x))
    [1] TRUE
    
    0 讨论(0)
提交回复
热议问题