【问题标题】:vectorize replacement over 3d for loop在 3d for 循环中矢量化替换
【发布时间】:2013-09-15 18:19:38
【问题描述】:

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

【问题讨论】:

    标签: r for-loop vectorization


    【解决方案1】:

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

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-03
      • 2018-10-15
      • 1970-01-01
      • 1970-01-01
      • 2019-02-28
      • 2011-02-09
      相关资源
      最近更新 更多