У меня есть код с 4-мерным массивом, и мне нужно применить which.max для нескольких измерений. Это довольно медленно, я бы хотел найти способы его ускорить.
Пример:
library(microbenchmark)
array4d <- array( runif(5*500*50*5 ,-1,0),
dim = c(5, 500, 50, 5) )
microbenchmark(
max_idx <- apply(array4d, c(1,2,3), which.max )
)
Любые подсказки приветствуются, спасибо!
Изменить: я удалось сделать это немного быстрее (хотя и уродливо), напрямую закодировав его в циклах for - но я надеюсь, что у кого-то есть идеи получше!
method1 <- function(z) {
apply(z, c(1,2,3), which.max)
}
method2 <- function(z){
result <- array( , dim = dim(z)[1:3] )
for(i in 1:dim(z)[1]){
for(j in 1:dim(z)[2]){
for(k in 1:dim(z)[3]){
result[i, j, k] <- which.max(z[i,j,k,])
}
}
}
return(result)
}
microbenchmark(
result1 <- method1(array4d),
result2 <- method2(array4d))
> microbenchmark(
+ result1 <- method1(array4d),
+ result2 <- method2(array4d)
+ )
Unit: milliseconds
expr min lq mean median uq max neval cld
result1 <- method1(array4d) 111.9061 140.1400 165.2441 155.6773 170.3967 384.6425 100 b
result2 <- method2(array4d) 113.4572 123.2429 136.8583 130.8505 141.9620 215.0968 100 a