我可以使用i,j和x的向量定义sparse Matrix:
i <- c(1,3:8)
j <- c(2,9,6:10)
x <- 7 * (1:7)
(A <- sparseMatrix(i, j, x = x))
我想从此稀疏矩阵中提取i
,j
和x
元素,因此我可以在另一个包中重新创建矩阵。 i
和x
:
i <- A@i + 1
x <- A@x
(注意i和x的顺序已经改变,但它们的相对关联是相同的:i = 4仍然在x = 21的同一位置)
然而,稀疏矩阵的最后一个元素是p
:“指针的数字(整数值)向量,每列(或行)一个,到元素的初始(从零开始)索引在列(或行)中。“
如何将A@i
和A@p
转换为用于定义矩阵的原始j
元素?
答案 0 :(得分:5)
弄清楚列的存储方式有点棘手。我很难解释它,但也许代码可以帮助你了解正在发生的事情:
# Rows
A@i+1
# [1] 1 4 5 6 3 7 8
# Cols (a little tricky..)
findInterval(seq(A@x)-1,A@p[-1])+1
# [1] 2 6 7 8 9 9 10
# Values
A@x
# [1] 7 21 28 35 14 42 49
因此,在删除第一个元素后,A@p
每列都有一个元素。 A@p+1
的范围是1:length(A@x)
。基本上,对于每一列,它表示此列中出现的A@x
的第一个元素位于此A@x
的索引处。但棘手的部分是,如果 nothing 位于该列中,那么它将使用最后一列的索引。这是我的不好解释......希望它能与代码结合起来。
答案 1 :(得分:2)
使用TsparseMatrix对象更容易:
A <- as(A, "TsparseMatrix")
8 x 10 sparse Matrix of class "dgTMatrix"
[1,] . 7 . . . . . . . .
[2,] . . . . . . . . . .
[3,] . . . . . . . . 14 .
[4,] . . . . . 21 . . . .
[5,] . . . . . . 28 . . .
[6,] . . . . . . . 35 . .
[7,] . . . . . . . . 42 .
[8,] . . . . . . . . . 49
> dput(A)
new("dgTMatrix"
, i = c(0L, 3L, 4L, 5L, 2L, 6L, 7L)
, j = c(1L, 5L, 6L, 7L, 8L, 8L, 9L)
, Dim = c(8L, 10L)
, Dimnames = list(NULL, NULL)
, x = c(7, 21, 28, 35, 14, 42, 49)
, factors = list()
)
也可以创建,但需要指定尺寸:
(A <- spMatrix(8,10, i=i, j=j, x = x))