从稀疏矩阵中提取i和j

时间:2014-01-13 19:23:18

标签: r sparse-matrix

我可以使用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))

我想从此稀疏矩阵中提取ijx元素,因此我可以在另一个包中重新创建矩阵。 ix

很容易实现
i <- A@i + 1
x <- A@x

(注意i和x的顺序已经改变,但它们的相对关联是相同的:i = 4仍然在x = 21的同一位置)

然而,稀疏矩阵的最后一个元素是p:“指针的数字(整数值)向量,每列(或行)一个,到元素的初始(从零开始)索引在列(或行)中。“

如何将A@iA@p转换为用于定义矩阵的原始j元素?

2 个答案:

答案 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))