У меня есть вычисление, которое делает версию этого:
n <- 5
l <- 3
m <- seq(0,1,length.out = n)
r <- seq(3,4,length.out = n)
y <- 1:n
pp <- sapply(0:l, function(h) cumsum(y[(h+1):n]*y[1:(n-h)]))
rec.acf <- sapply(0:l, function(h) pp[[h+1]] + sapply((h+1):n, function(j) m[j] + r[j-h]) )
для получения
> rec.acf
[[1]]
[1] 4.0 8.5 18.0 34.5 60.0
[[2]]
[1] 5.25 11.75 24.25 44.75
[[3]]
[1] 6.5 15.0 30.5
[[4]]
[1] 7.75 18.25
На практике, конечно, n
и l
намного больше (а фактические функции, вычисляющие автоковариации над выборками увеличивающегося размера, более сложны).
Когда l
относительно мало, как я и надеялся, вычисления работают намного быстрее, чем другие разработанные мной реализации, в которых не учитывается, что я могу перерабатывать много идентичных вычислений через pp
.
Однако картина меняется на противоположную, когда l
является большим относительно n
, вероятно потому, что внешний sapply
затем отправляет много внутренних циклов. Есть ли что-то явно неэффективное в моем подходе?
Я возился с mapply
, но без особого успеха.