Как преобразовать разреженную матрицу в матрицу индекса и значение ненулевого элемента
Мы можем построить разреженную матрицу из индекса и значения ненулевого элемента с помощью sparseMatrix
или spMatrix
. Есть ли какая-либо функция, преобразующая разреженную матрицу обратно в индекс и значение всех ненулевых элементов? Например
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
?
Ответы
Ответ 1
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.frame
или as.matrix
:
sparseToVector <- function(x)as.matrix(summary(x))
B <- sparseToVector(A)
## test case:
identical(B,cbind(i,j,x))
# [1] TRUE
Ответ 2
Ваша матрица A
находится в разреженном сжатом формате (класс dgCMatrix
). Вы можете принудить его в не сжатый разреженный формат
A.nc <- as (A, "dgTMatrix")
Или вы могли бы указать giveCsparse = TRUE
в вызове sparseMatrix
.
Триплетная форма dgTMatrix
в основном содержит все, что вы ищете в слотах i
, j
и x
, просто i
и j
индексирование выполняется с помощью смещений на основе 0:
> str (A.nc)
Formal class 'dgTMatrix' [package "Matrix"] with 6 slots
[email protected] i : int [1:3] 0 2 4
[email protected] j : int [1:3] 0 2 3
[email protected] Dim : int [1:2] 5 4
[email protected] Dimnames:List of 2
.. ..$ : NULL
.. ..$ : NULL
[email protected] x : num [1:3] 1 2 3
[email protected] factors : list()
> cbind (i = [email protected] + 1, j = [email protected] + 1, x = [email protected])
i j x
[1,] 1 1 1
[2,] 3 3 2
[3,] 5 4 3
> all (cbind (i = [email protected] + 1, j = [email protected] + 1, x = [email protected]) == cbind (i, j, x))
[1] TRUE
Ответ 3
Используйте which
с 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