gpt4 book ai didi

r - 加速重复的函数调用

转载 作者:行者123 更新时间:2023-12-02 05:17:00 25 4
gpt4 key购买 nike

我正在尝试计算以下值:

1/N * sum[i=0 to N-1]( log(abs(r_i - 2 * r_i * x_i)) )

其中 x_i 是递归计算的:

x_{i+1} = r_i * x_i * (1 - x_i)

其中所有的 r_i 都给出了(尽管它们随 i 改变),并且给出了 x_0。(据我所知,没有任何棘手的数学方法可以将此计算简化为非迭代公式以加快计算速度)。

我的问题是速度非常慢,我想知道是否有一些外部观点可以帮助我加快速度

# x0: a scalar. rs: a numeric vector, length N
# N: typically ~5000
f <- function (x0, rs, N) {
lambda <- 0
x <- x0
for (i in 1:N) {
r <- rs[i]
rx <- r * x
lambda <- lambda + log(abs(r - 2 * rx))
# calculate the next x value
x <- rx - rx * x
}
return(lambda / N)
}

现在这个函数本身非常快,但是我想调用它 ~ 4,000,000 次(对 2000 x 2000 矩阵中的每个单元格一次),每次都有不同的 rs 向量。

但是如果我只调用它 2500 次(N=1000),它需要大约 25 秒,配置文件如下:

      self.time self.pct total.time total.pct
"f" 19.98 81.22 24.60 100.00
"*" 2.00 8.13 2.00 8.13
"-" 1.32 5.37 1.32 5.37
"+" 0.70 2.85 0.70 2.85
"abs" 0.56 2.28 0.56 2.28
":" 0.04 0.16 0.04 0.16

有谁知道我该如何加快速度?看起来乘法需要一段时间,但我已经预先缓存了任何重复的乘法。

我还尝试利用 sum( log(stuff(i)) )log(prod(stuff(i)) 相同的优势来减少调用到 logabs,但事实证明这是不可行的,因为 stuff 是一个长度为 N 的向量(以千为单位) ) 和典型值至少为 1,因此 prod(stuff) 最终成为 R 的 Inf

最佳答案

在我看来,瓶颈是函数中的 for 循环。

我用Rcpp重写如下:

# x0: a scalar. rs: a numeric vector, length N
# N: typically ~5000
x0 <- runif(1)
N <- 5000
rs <- rnorm(5000)
f <- function (x0, rs, N) {
lambda <- 0
x <- x0
for (i in 1:N) {
r <- rs[i]
rx <- r * x
lambda <- lambda + log(abs(r - 2 * rx))
# calculate the next x value
x <- rx - rx * x
}
return(lambda / N)
}

library(inline)
library(Rcpp)
f1 <- cxxfunction(sig=c(Rx0="numeric", Rrs="numeric"), plugin="Rcpp", body='
double x0 = as<double>(Rx0);
NumericVector rs(Rrs);
int N = rs.size();
double lambda = 0, x = x0, r, rx;
for(int i = 0;i < N;i++) {
r = rs[i];
rx = r * x;
lambda = lambda + log( fabs(r - 2 * rx) );
x = rx - rx * x;
}
lambda /= N;
return wrap(lambda);
')
f(x0, rs, N)
f1(x0, rs)

library(rbenchmark)

benchmark(f(x0, rs, N), f1(x0, rs))

f1 在我上次测试中比 f 快 140 倍。

关于r - 加速重复的函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14495697/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com