【问题标题】:recursive loop using apply R使用 apply R 的递归循环
【发布时间】:2018-02-08 10:46:46
【问题描述】:

我有两个循环,我想使用一些应用函数进行转换,以减少计算时间。第一个似乎很容易做到,第二个问题就出现了,因为 S 在每次迭代中都会用它自己的值进行更新。

S0   = 100
a    = 0.00016
b    = 0.0126
sim    = 10000 
drifts = 1000
Si = rep(0,sim)

for(i in (1:sim))
{
 S =  S0
 for (j in (1:drifts))
  {
   z = rnorm(1, mean = 0, sd = 1)
   S = S * exp(a + b*z)
  }
  Si[i] =S 
}

谁能帮忙?

【问题讨论】:

  • j 循环中完成的计算不会在任何地方存储或使用。那么为什么要使用循环j?看起来你错过了什么。
  • 似乎 j 循环在每次迭代中更新 S 值,而 i- 循环将值重置为 S0
  • @Antonis 就是这样

标签: r for-loop recursion apply


【解决方案1】:

下面的代码怎么样。我已经用产品替换了 j-loop,我认为数学是正确的。

sapply(1:sim,function(x) S0*prod(exp(a + b*rnorm(drifts))))

它也明显更快:

> system.time(for(i in (1:sim))
+ {
+   S =  S0
+   for (j in (1:drifts))
+   {
+     z = rnorm(1, mean = 0, sd = 1)
+     S = S * exp(a + b*z)
+   }
+   Si[i] =S 
+ }
+ )
   user  system elapsed 
  23.29    0.02   23.34 
> 
> system.time(Si<-sapply(1:sim,function(x) S0*prod(exp(a + b*rnorm(drifts)))))
   user  system elapsed 
   1.76    0.00    1.76 

【讨论】:

  • 这绝对是最好的办法,不错
【解决方案2】:
calc_s <- function(S, i = 1) {
  S <- S * exp(a + b * rnorm(1, mean = 0, sd = 1))
  return (if (i < drifts) calc_s(S, i + 1) else S)}
S2 <- sapply(1:sim, function(x) {
  calc_s(S0)
})

虽然速度并不快

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 2017-12-06
    • 1970-01-01
    • 1970-01-01
    • 2015-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多