0

我想矢量化(或以任何可能的方式优化)以下 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 
    }
}

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

示例datref数组:

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

1 回答 1

2

您可以改用它。它创建了一个new_ref符合 的数组dat,因此您可以直接比较它们:

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

dat3 <- dat

dat3[dat3 > new_ref] <- NA

与您的循环比较:

dat2 <- dat

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

identical(dat2, dat3)
#[1] TRUE
于 2013-09-15T19:28:09.420 回答