【发布时间】:2020-09-22 22:42:13
【问题描述】:
我有一个非常大的稀疏矩阵(40,000 x 100,000+),如果某个元素大于某个阈值,我想用 1 替换它。但是,矩阵中的每一行都有一个唯一的阈值(这只是一个向量,它是行的长度)所以我想逐行检查特定行的元素是否大于唯一阈值为那一行。
我最初通过遍历稀疏矩阵的所有非零元素来尝试使用 for 循环解决此问题,但这花费了太长时间,因为我有超过 1 亿个元素要遍历。
number_of_elem <- matrix@x %>% length()
for (j in 1:number_of_elem){
threshold <- thres_array[j]
if (threshold == 0){
next
}
if (matrix@x[j] > threshold){
matrix@x[j] <- 1
}
}
然后我开始尝试使用 apply 函数,但我无法准确解决如果阈值为零时跳过阈值的问题。作为参考,我首先计算了每一行的分位数,并将我的阈值设置为高于第 95 个百分位数。由于它是一个稀疏矩阵,因此某些阈值为零。
关于如何解决这个问题的任何想法?根据我在 R 中的了解,最好将代码矢量化并避免 for 循环,但我想不出一种可持续的方法。
【问题讨论】:
-
什么是
class(matrix)? -
> class(matrix) [1] "dgCMatrix" attr(,"package") [1] "Matrix"
标签: r optimization sparse-matrix memory-efficient