构建稀疏矩阵的 R 代码

4

我正在阅读R语言中Matrix包的说明。但是我无法理解函数中的p参数:

sparseMatrix(i = ep, j = ep, p, x, dims, dimnames,
         symmetric = FALSE, index1 = TRUE,
         giveCsparse = TRUE, check = TRUE)

根据http://stat.ethz.ch/R-manual/R-devel/library/Matrix/html/sparseMatrix.html,下面是需要翻译的内容:

p:
每列(或行)对应一个数值向量(整数值),指向该列(或行)中元素的初始(从零开始)索引。i、j 或 p 必须有且仅有一个缺失。

我认为 p 用于压缩表示行或列索引,因为在 ij 中有多个元素具有相同的值来表示单个行/列是浪费的。但是当我尝试提供的示例时,仍然无法弄清楚 p 如何控制将 x 的哪个元素放入哪个行/列。

dn <- list(LETTERS[1:3], letters[1:5])
## pointer vectors can be used, and the (i,x) slots are sorted if necessary:
m <- sparseMatrix(i = c(3,1, 3:2, 2:1), p= c(0:2, 4,4,6), x = 1:6, dimnames = dn)
1个回答

3
只需向下阅读?SparseMatrix,了解如何解释p。(特别是要注意关于p“扩展形式”的部分。)

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

这是一个小函数,可以帮助您实际了解它的含义:

pex <- function(p) {
    dp <- diff(p)
    rep(seq_along(dp), dp)
}

## Play around with the function to discover the indices encoded by p.
pex(p = c(0,1,2,3))
# [1] 1 2 3

pex(p = c(0,0,1,2,3))
# [1] 2 3 4

pex(p = c(10,11,12,13))
# [1] 1 2 3

pex(p = c(0,0,2,5))
# [1] 2 2 3 3 3

pex(p = c(0,1,3,3,3,3,8))
# [1] 1 2 2 6 6 6 6 6

谢谢,我现在明白了。因此,p中第i个元素的值表示已经包括在前(i-1)列中的x元素的数量。换句话说,p中第i个元素与第(i-1)个元素之间的差是(i-1)列中x元素的数量。 - GorillaInR
@GorillaInR -- 是的。严格来说,你评论中的倒数第二句话不准确,但最后一句是正确的。所以,看起来你已经明白了。 - Josh O'Brien
如果最终陈述为真,则倒数第二个陈述也将为真:每个差异是相应列中x元素的数量,那么前(i-1)个差异的总和=已包括在前(i-1)列中的x元素的总数=p的第i个元素的值。 - GorillaInR
@GorillaInR -- 但是看看 pex(p = c(10,11,12,13)) 的结果。 - Josh O'Brien
但是p必须以0开头:“如果i或j缺失,则p必须是一个非递减的整数向量,其第一个元素为零。”无论如何,感谢您指出了p解释的关键部分,否则我永远不会想到。 - GorillaInR
@GorillaInR -- 你说得对。感谢你指出了那个问题。 - Josh O'Brien

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接