R Matrix Package:稀疏矩阵的 dgCMatrix class 中属性的含义
R Matrix Package: Meaning of the attributes in the dgCMatrix class for sparse matrices
我看过 Matrix package and at their slides。我试图理解 dgCMatrix
class 中的论点背后的直觉和含义是什么。我明白
@i
给出矩阵中非零项的从零开始的行索引。
@j
给出矩阵中非零项的从零开始的列索引。
@x
给出 (i,j)
位置的非零元素。
但是我不明白指针的意思@p
。 documentation 表示
numeric (integer-valued) vector of pointers, one for each column (or row), to the initial (zero-based) index of elements in the column (or row).
这不是很有用。在 "detail" 部分,他们在同一页上解释了更多
If i
or j
is missing then p
must be a non-decreasing integer vector whose first element is zero. It provides the compressed, or “pointer” representation of the row or column indices, whichever is missing. The expanded form of p
, rep(seq_along(dp),dp)
where dp <- diff(p)
, is used as the (1-based) row or column indices.
这对我来说绝对是非直觉的。有人可以简单解释一下 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
的重新排列形式,但我仍然不明白它的意思。
我终于明白了!我发布答案以供将来参考。
查看矩阵 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]
),我们查看从最左列到最右列的每一列,然后添加到我们的 "counter"(现在设置为 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
。背后的直觉是,它是从左到右按列排列的非零元素数量的计数器。
我看过 Matrix package and at their slides。我试图理解 dgCMatrix
class 中的论点背后的直觉和含义是什么。我明白
@i
给出矩阵中非零项的从零开始的行索引。@j
给出矩阵中非零项的从零开始的列索引。@x
给出(i,j)
位置的非零元素。
但是我不明白指针的意思@p
。 documentation 表示
numeric (integer-valued) vector of pointers, one for each column (or row), to the initial (zero-based) index of elements in the column (or row).
这不是很有用。在 "detail" 部分,他们在同一页上解释了更多
If
i
orj
is missing thenp
must be a non-decreasing integer vector whose first element is zero. It provides the compressed, or “pointer” representation of the row or column indices, whichever is missing. The expanded form ofp
,rep(seq_along(dp),dp)
wheredp <- diff(p)
, is used as the (1-based) row or column indices.
这对我来说绝对是非直觉的。有人可以简单解释一下 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
的重新排列形式,但我仍然不明白它的意思。
我终于明白了!我发布答案以供将来参考。
查看矩阵 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]
),我们查看从最左列到最右列的每一列,然后添加到我们的 "counter"(现在设置为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
。背后的直觉是,它是从左到右按列排列的非零元素数量的计数器。