Решение проще, чем кажется.Просто избавьтесь от двух внутренних циклов.
Я написал решение в виде функции для тестирования.
f1 <- function(m, n, o){
a <- seq_len(m)
b <- matrix(1:(n*o), nrow = n)
y <- array(0, dim = c(m, n, o))
for(i in seq_len(m)){
for(j in seq_len(n)){
for(k in seq_len(o)){
y[i, j, k] <- a[i] + b[j, k]
}
}
}
y
}
f2 <- function(m, n, o){
a <- seq_len(m)
b <- matrix(1:(n*o), nrow = n)
y <- array(0, dim = c(m, n, o))
for(i in seq_len(m)){
y[i, , ] <- a[i] + b
}
y
}
m <- 11
n <- 22
o <- 33
y <- f1(m, n, o)
z <- f2(m, n, o)
identical(y, z)
#[1] TRUE
Теперь проверьте производительность.
library(microbenchmark)
library(ggplot2)
mb <- microbenchmark(
f1 = f1(m, n, o),
f2 = f2(m, n, o)
)
mb
autoplot(mb)