【问题标题】:Extract i and j from a sparse Matrix从稀疏矩阵中提取 i 和 j
【发布时间】:2023-03-15 16:52:01
【问题描述】:

我可以使用 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 元素?

【问题讨论】:

    标签: r sparse-matrix


    【解决方案1】:

    弄清楚列的存储方式有点棘手。我很难解释它,但也许代码会帮助你了解发生了什么:

    # 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 位于该列中,则它使用最后一列的索引。那是我不好的解释……希望它与代码结合使用会有所帮助。

    【讨论】:

    • 谢谢!如果我做j &lt;- findInterval(seq(A@x)-1,A@p[-1])+1 然后(B &lt;- sparseMatrix(i, j, x = x)) 然后all.equal(A, B) 我是真的。我已经在其他一些dgCMatrix 对象上验证了这一点,并且该方法有效。谢谢!
    • 嗯,我只是在考虑这个问题,带有 0 或 1 个元素的矩阵的代码可能存在一些问题,所以如果你正在为此编写代码,你可能想要检查极端情况。
    • 会的。幸运的是,在我的用例中,矩阵有数百万个元素。如果矩阵出现 0 或 1 个元素,脚本将在超过前几行之前返回错误。
    • 使用“TsparseMatrix”类对行和列的解密要容易得多。在那里你得到了 i 和 j 并且只需要记住稀疏类是从零开始的。
    【解决方案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))
    

    【讨论】:

      猜你喜欢
      • 2019-10-05
      • 1970-01-01
      • 1970-01-01
      • 2012-01-10
      • 2018-01-19
      • 1970-01-01
      • 1970-01-01
      • 2017-03-31
      • 2013-11-05
      相关资源
      最近更新 更多