我们说我有一个很大的稀疏矩阵:
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]
符号访问这些符号(或者您需要按元素划分,而不是真正有效)。
如何在不将其转换为密集矩阵的情况下访问此矩阵的随机元素?我们欢迎替代解决方案(其他包等)。
答案 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)