如何将稀疏矩阵转换为非零元素的索引和值的矩阵

14

我们可以使用 sparseMatrixspMatrix 从非零元素的索引和值构建稀疏矩阵。是否有任何函数可以将稀疏矩阵转换回所有非零元素的索引和值?例如:

i <- c(1,3,5); j <- c(1,3,4); x <- 1:3
A <- sparseMatrix(i, j, x = x)

B <- sparseToVector(A)
## test case:
identical(B,cbind(i,j,x))

是否有任何函数可以执行与 sparseToVector 类似的工作?

3个回答

9
你的矩阵A处于稀疏压缩格式(dgCMatrix类)。你可以通过强制转换将其转换为非压缩稀疏格式。
A.nc <- as (A, "dgTMatrix")

或者,在sparseMatrix调用中指定giveCsparse = TRUE。
dgTMatrix的三元组形式基本上包含了您在i、j和x槽中寻找的所有内容,只是使用基于0的偏移进行索引。
> 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

@flodel:好吧...好的...我被说服了。 - cbeleites unhappy with SX
你是不是想说 giveCsparse = FALSE - flying sheep

8
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

你可以轻松地将其传递给 as.data.frameas.matrix


sparseToVector <- function(x)as.matrix(summary(x))
B <- sparseToVector(A)
## test case:
identical(B,cbind(i,j,x))
# [1] TRUE

3
使用whicharr.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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接