矢量化替换在3d for循环

时间:2013-09-15 18:19:39

标签: r for-loop vectorization

我想对以下3d for 循环进行矢量化(或以任何可能的方式进行优化):

  

dat:dim = c(n,n,m)的数组

     

ref:具有dim = c(n,m)的矩阵

for(i in 1:length(dat[,1,1])){
    for(k in 1:length(dat[1,1,])){
        dat[i,,k][dat[i,,k] > ref[i,k]] <- NA 
    }
}

我正在使用的数组是7e3 x 7e3 x 2e2,因此上面的 for 循环实际上非常昂贵。要启动,我需要执行两个或三个非常类似的操作(在不同的数组上),这样任何节省的时间都会成倍增加。

示例datref数组:

dat <- array(seq(1,75), dim=c(5,5,3))
ref <- cbind(seq(6,10), seq(36,40), seq(61,65))

1 个答案:

答案 0 :(得分:2)

您可以改用它。它会创建一个符合new_ref的{​​{1}}数组,因此您可以直接比较它们:

dat

与你的循环比较:

new_ref <- aperm(array(ref, dim(dat)[c(1,3,2)]), c(1,3,2))

dat3 <- dat

dat3[dat3 > new_ref] <- NA