2013-09-15 2 views
0

Я хотел бы векторизации (или оптимизировать в любой возможной форме), следующий 3d для цикла:замена векторизовать над 3d для цикла

DAT: массив с тусклыми = с (п, п, м)

исй: матрица с тусклым = с (п, т)

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 
    } 
} 

массивом Я работаю с является 7e37e3 х х 2e2, так что для цикл выше непрактично дорог. Для загрузки мне нужно будет выполнить две или три очень похожие операции (на разных массивах), поэтому любое сохраненное время будет умножено.

Пример dat и ref массивы:

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

ответ

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 
Смежные вопросы