首页 > 解决方案 > R:对于缓慢的双 sapply,我该怎么办?

问题描述

我有一个计算可以做这个版本:

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,没有太大的成功。

标签: rsapply

解决方案


内循环是不必要的:

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

推荐阅读