【问题标题】:R Matrix Package: Meaning of the attributes in the dgCMatrix class for sparse matricesR 矩阵包:稀疏矩阵的 dgCMatrix 类中属性的含义
【发布时间】:2020-04-20 01:52:29
【问题描述】:

我查看了Matrix 包和他们的slides。我试图理解 dgCMatrix 类中参数背后的直觉和含义。我明白了

  • @i 给出矩阵中非零条目的从零开始的行索引。
  • @j 给出矩阵中非零条目的从零开始的列索引。
  • @x 在(i,j) 位置给出非零元素。

但是我不明白指针@p 的含义。 documentation 说

指针的数字(整数值)向量,每列(或行)一个,指向列(或行)中元素的初始(从零开始)索引。

这不是很丰富。在“详细信息”部分,在同一页面上,他们解释了更多

如果缺少i 或j,则p 必须是第一个元素为零的非递减整数向量。它提供行或列索引的压缩或“指针”表示,以缺失者为准。 p 的扩展形式rep(seq_along(dp),dp) 其中dp <- diff(p) 用作(从1 开始的)行或列索引。

这对我来说绝对是不直观的。有人可以简单解释一下p 代表什么吗?我创建了一个最小的工作示例,但可以随意创建一个新示例。


最小的工作示例

# Define non-zero values and their row/col indeces
i_indeces <- c(1, 3, 4, 6, 8, 9)
j_indeces <- c(2, 9, 6, 3, 9, 10)
values <- c(60, 20, 10, 40, 30, 50)
# Create the sparse matrix
A <- sparseMatrix(
    i=i_indeces,
    j=j_indeces,
    x=values,
    dims=c(10, 20)
)

在哪里

> str(A)
Formal class 'dgCMatrix' [package "Matrix"] with 6 slots
  ..@ i       : int [1:6] 0 5 3 2 7 8
  ..@ p       : int [1:21] 0 0 1 2 2 2 3 3 3 5 ...
  ..@ Dim     : int [1:2] 10 20
  ..@ Dimnames:List of 2
  .. ..$ : NULL
  .. ..$ : NULL
  ..@ x       : num [1:6] 60 40 10 20 30 50
  ..@ factors : list()

和

> A
10 x 20 sparse Matrix of class "dgCMatrix"

 [1,] . 60  . . .  . . .  .  . . . . . . . . . . .
 [2,] .  .  . . .  . . .  .  . . . . . . . . . . .
 [3,] .  .  . . .  . . . 20  . . . . . . . . . . .
 [4,] .  .  . . . 10 . .  .  . . . . . . . . . . .
 [5,] .  .  . . .  . . .  .  . . . . . . . . . . .
 [6,] .  . 40 . .  . . .  .  . . . . . . . . . . .
 [7,] .  .  . . .  . . .  .  . . . . . . . . . . .
 [8,] .  .  . . .  . . . 30  . . . . . . . . . . .
 [9,] .  .  . . .  . . .  . 50 . . . . . . . . . .
[10,] .  .  . . .  . . .  .  . . . . . . . . . . .

注意

我知道rep(seq_along(diff(A@p)), diff(A@p)) 是j_indeces 的重新排列形式,但我仍然不明白它的含义。

【问题讨论】:

    标签: r pointers matrix sparse-matrix


    【解决方案1】:

    我终于明白了!我正在发布答案以供将来参考。 看矩阵A

     [1,] . 60  . . .  . . .  .  . . . . . . . . . . .
     [2,] .  .  . . .  . . .  .  . . . . . . . . . . .
     [3,] .  .  . . .  . . . 20  . . . . . . . . . . .
     [4,] .  .  . . . 10 . .  .  . . . . . . . . . . .
     [5,] .  .  . . .  . . .  .  . . . . . . . . . . .
     [6,] .  . 40 . .  . . .  .  . . . . . . . . . . .
     [7,] .  .  . . .  . . .  .  . . . . . . . . . . .
     [8,] .  .  . . .  . . . 30  . . . . . . . . . . .
     [9,] .  .  . . .  . . .  . 50 . . . . . . . . . .
    [10,] .  .  . . .  . . .  .  . . . . . . . . . . .
    

    属性p

    > A@p
     [1] 0 0 1 2 2 2 3 3 3 5 6 6 6 6 6 6 6 6 6 6 6
    

    基本上计算每行中非零元素的数量。它是这样构造的

    • 按照惯例,第一个元素总是0(不知道为什么),所以p = [0]
    • 接下来,从矩阵的左上角开始(即[1, 1]),我们查看从最左列到最右列的每一列,并添加到我们的“计数器”(现在是设置为0) 该列中非零元素的数量。

      • 1 列没有非零元素,因此我们将0 添加到我们的计数器中。 p=[0,0]。
      • 2 列有一个非零元素 (60),因此我们将 1 添加到我们的计数器 p=[0, 0, 0+1]=[0,0,1]
      • 列3 有一个非零元素(40) 所以p=[0, 0, 1, 1+1]=[0, 0, 1, 2]
      • 列4 没有非零元素,所以p=[0, 0, 1, 2, 2+0]=[0, 0, 1, 2, 2]
      • 列5 没有非零元素,所以p=[0, 0, 1, 2, 2, 2]
      • 6 列有一个非零元素 (10) 所以p=[0, 0, 1, 2, 2, 2, 3]
      • 列7 没有非零元素,所以p=[0, 0, 1, 2, 2, 2, 3, 3]
      • 列8 没有非零元素,所以p=[0, 0, 1, 2, 2, 2, 3, 3, 3]
      • 列9 有两个非零元素(20 和30)所以p=[0, 0, 1, 2, 2, 2, 3, 3, 3, 5]
      • 10 列有 1 个非零元素 (50) 所以p=[0, 0, 1, 2, 2, 2, 3, 3, 3, 5, 6]
      • 11 到 20 的列都包含零元素,因此我们附加 [6, 6, 6, 6, 6, 6, 6, 6, 6, 6]

    因此我们得到了我们想要的p。背后的直觉是,它是从左到右按列排列有多少非零元素的计数器。

    【讨论】:

      猜你喜欢
      • 2017-10-03
      • 1970-01-01
      • 1970-01-01
      • 2018-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-24
      相关资源
      最近更新 更多