Р: Что я могу сделать с медленным двойным сапли? - PullRequest
0 голосов
/ 10 января 2019

У меня есть вычисление, которое делает версию этого:

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, но без особого успеха.

1 Ответ

0 голосов
/ 10 января 2019

Внутренний цикл не нужен:

mm = lapply(0:l, function(h) tail(m, length(m) - h) + head(r, length(r) - h))

mapply("+", pp, mm)
#[[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
...