使用NA默认条目创建(和访问)稀疏矩阵

Chr*_*ois 14 r default-value sparse-matrix na

在了解了在R中使用稀疏矩阵选项之后,我想使用Matrix包从以下数据框创建稀疏矩阵,并使所有其他元素都是NA.

     s    r d
1 1089 3772 1
2 1109  190 1
3 1109 2460 1
4 1109 3071 2
5 1109 3618 1
6 1109   38 7
Run Code Online (Sandbox Code Playgroud)

我知道我可以使用以下内容创建一个稀疏矩阵,像往常一样访问元素:

> library(Matrix)
> Y <- sparseMatrix(s,r,x=d)
> Y[1089,3772]
[1] 1
> Y[1,1]
[1] 0
Run Code Online (Sandbox Code Playgroud)

但如果我想将默认值设为NA,我尝试了以下内容:

  M <- Matrix(NA,max(s),max(r),sparse=TRUE)
  for (i in 1:nrow(X))
    M[s[i],r[i]] <- d[i]
Run Code Online (Sandbox Code Playgroud)

并得到了这个错误

Error in checkSlotAssignment(object, name, value) : 
  assignment of an object of class "numeric" is not valid for slot "x" in an object of class "lgCMatrix"; is(value, "logical") is not TRUE
Run Code Online (Sandbox Code Playgroud)

不仅如此,我发现访问元素需要更长的时间.

> system.time(Y[3,3])
   user  system elapsed 
  0.000   0.000   0.003 
> system.time(M[3,3])
   user  system elapsed 
  0.660   0.032   0.995 
Run Code Online (Sandbox Code Playgroud)

我该如何创建这个矩阵?为什么一个矩阵使用起来要慢得多?

以下是上述数据的代码段:

X <- structure(list(s = c(1089, 1109, 1109, 1109, 1109, 1109), r = c(3772, 
190, 2460, 3071, 3618, 38), d = c(1, 1, 1, 2, 1, 7)), .Names = c("s", 
"r", "d"), row.names = c(NA, 6L), class = "data.frame")
Run Code Online (Sandbox Code Playgroud)

Thi*_*rry 16

为什么要使用默认的NA值?据我所知,如果矩阵具有零单元,则它们只是稀疏的.由于NA是非零值,因此您将从稀疏矩阵中获得所有好处.如果矩阵几乎没有任何零,则经典矩阵甚至更有效.经典矩阵就像一个将根据尺寸切割的矢量.所以它只需要存储数据向量和维度.稀疏矩阵仅存储非零值,但也存储位置.当且仅当您有足够的零值时,这是一个优势.

  • "当且仅当你有足够的零值时,这才是一个优势.":根本不是真的.用"one"或任何其他数字替换评论中每次出现的"零",你会发现你的句子仍然存在.使用零的事实仅仅是按照惯例,并且有许多应用程序使默认值不为零是有意义的.在节省内存方面,将默认值设置为数据集中最常出现的数字是有意义的. (2认同)

Mar*_*ler 11

是的,Thierry的回答绝对是真的我可以说是'Matrix'包的共同作者......

对于你的另一个问题:为什么访问"M"比"Y"慢?主要答案是"M"比"Y"更稀疏,因此要小得多 - 并且 - 取决于所涉及的大小和平台的RAM - 对于更小的对象,访问时间更快,特别是对于索引它们.

  • 遗憾的是,所有非零单元始终存储.能够为sparseMatrix指定除零之外的默认值会很好. (10认同)