Подтвердить что ты не робот

Как преобразовать разреженную матрицу в матрицу индекса и значение ненулевого элемента

Мы можем построить разреженную матрицу из индекса и значения ненулевого элемента с помощью 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?

4b9b3361

Ответ 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