Fra*_*ank 3 performance r matrix sparse-matrix
我有一个大的稀疏矩阵。在用一些数学运算填充矩阵后,我意识到由于除以零错误,我有一些无限值。如何检查该矩阵的非有限值?
这是一个玩具矩阵。
A <- Matrix(nrow = 150000, ncol = 150000, data = 0, sparse = TRUE)
A[1, 1] = Inf
A[1, 3] = NA
A[2, 1] = -Inf
Run Code Online (Sandbox Code Playgroud)
试图找到它的非有限值给我一个错误:
test <- A[!is.finite(A)]
#Error: cannot allocate vector of size 83.8 Gb
Run Code Online (Sandbox Code Playgroud)
我也尝试逐行扫描这个矩阵,但它需要很长时间。
library(magrittr)
for(i in 1:nrow(A)){
if((
A[i, ] %>% .[!is.finite(.)] %>% length
) > 0) print(i)
}
Run Code Online (Sandbox Code Playgroud)
然后我尝试并行运行它,但我认为这是矫枉过正。更何况,还需要很长的时间。
library(parallel)
library(magrittr)
numCores <- detectCores() - 1
cl <- makeCluster(numCores)
clusterExport(cl, c("A"))
clusterEvalQ(cl, library(magrittr))
out <- A %>% nrow %>% seq %>% parLapply(cl, X = ., function(i) A[i, ] %>% .[!is.finite(.)])
Run Code Online (Sandbox Code Playgroud)
我该如何继续?
如果我们想知道稀疏矩阵是否A有Inf、-Inf、NaN或NA,我们可以这样做
any(!is.finite(A@x))
#[1] TRUE
Run Code Online (Sandbox Code Playgroud)
如果我们也想知道他们的位置,我们可以这样做
subset(summary(A), !is.finite(x))
i j x
1 1 1 Inf
2 2 1 -Inf
3 1 3 NA
Run Code Online (Sandbox Code Playgroud)
评论:
有关、和之间的区别,请参阅R:逐元素矩阵除法。is.infinite!is.finiteis.nais.nan