【发布时间】:2019-03-06 01:55:28
【问题描述】:
我有相当大的稀疏矩阵(dgCMatrix 或dgTMatrix,但这在这里不是很重要)。我想将一些元素设置为零。
例如,我有3e4 * 3e4 矩阵,它是上三角形并且非常密集:~23% 的元素不是零。 (实际上我有更大的矩阵~1e5 * 1e5,但它们更稀疏)所以在三元组dgTMatrix 形式中,它需要大约 3.1gb 的 RAM。
现在我想将所有小于某个阈值的元素设置为零(例如,1)。
-
非常幼稚的方法(也讨论过here)将如下:
threshold <- 1 m[m < threshold] <- 0但这个解决方案远非完美 - 130 秒 运行时间(在有足够内存的机器上,因此没有交换),更重要的是 需要 ~ 25-30gb 额外内存。
-
我发现的第二个解决方案(而且大多是快乐的)要有效得多 - 从头开始构建新矩阵:
threshold <- 1 ind <- which(m@x > threshold) m <- sparseMatrix(i = m@i[ind], j = m@j[ind], x = m@x[ind], dims = m@Dim, dimnames = m@Dimnames, index1 = FALSE, giveCsparse = FALSE, check = FALSE)只需要约 6 秒,并且需要约 5gb 额外的内存。
问题是 - 我们可以做得更好吗? 特别有趣的是,我们是否可以用更少的 RAM 使用来做到这一点?如果能够就地执行此操作将是完美的。
【问题讨论】:
-
如果你只是试试
m@x[m@x < threshold]<-0呢? -
这不合适,因为我们会保留零。试试
str(m)- 它会有相同数量的非零元素和索引。 -
当然,但是您随后会相应地调整
i和j插槽,就像@Roland 的回答一样。 -
谢谢!出于某种原因,我自己没有猜到这样的把戏:-)
标签: r sparse-matrix