检查大型稀疏矩阵中非有限值的有效方法

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)

我该如何继续?

李哲源*_*李哲源 5

如果我们想知道稀疏矩阵是否AInf-InfNaNNA,我们可以这样做

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