如何从R Matrix库中访问稀疏矩阵的一些元素?

时间:2014-11-10 17:54:46

标签: r sparse-matrix

我们说我有一个很大的稀疏矩阵:

library(Matrix)
nrow <- 223045
ncol <- 9698
big <- Matrix(0, nrow, ncol, sparse = TRUE)
big[1, 1] <- 1

现在我想访问第一个元素:

big[1]
Error in asMethod(object) : 
  Cholmod error 'problem too large' at file ../Core/cholmod_dense.c, line 105

由于某种原因,它试图将我的矩阵转换为密集矩阵。实际上,看起来这个方法是从Matrix继承而不是从稀疏类继承:

showMethods("[")
[...]
x="dgCMatrix", i="numeric", j="missing", drop="missing"
    (inherited from: x="Matrix", i="index", j="missing", drop="missing")
[...]

当然,我可以使用完整的[i, j]索引

big[1, 1]

但我想在整个矩阵中访问一些随机元素,比如

random.idx <- c(1880445160,  660026771, 1425388501,  400708750, 2026594194, 1911948714)
big[ random.idx ]

并且无法使用[i, j]符号访问这些符号(或者您需要按元素划分,而不是真正有效)。

如何在不将其转换为密集矩阵的情况下访问此矩阵的随机元素?我们欢迎替代解决方案(其他包等)。

2 个答案:

答案 0 :(得分:1)

您可以使用S4提取@直接提取Matrix的元素,而不必先将其转换为普通矩阵。例如,

big@x[1]
big@x[random.idx]

实际上,您也可以提取其他属性。请参阅str(big)

答案 1 :(得分:1)

@ qoheleth的解决方案适合我。只需添加更多关于如何随机访问稀疏矩阵元素的上下文。

N.B。:对于使用Matrix包创建的稀疏矩阵,big_sparse_mat @ x属性存储矩阵的所有非零元素的索引。因此,随机访问索引应该在正确的范围内,否则,您将获得NA值。

假设有人想从稀疏矩阵中提取大于2的元素,以下代码将执行:

select_inds <- which( big_sparse_mat@x > 2.0)
select_elements <- big_sparse_mat@x[select_inds]

min_val <- min(select_elements)
max_val <- max(select_elements)