2016-08-15 133 views
1

Here is the image showing what i need to calculate。对不起,图片中的total_r实际上是代码中的test_gain,图片中的gamma代表代码中的alpha(对不起)。同样在图像中,我停止计算在t = 3,但实际上我想计算它,直到最后一个值为0.6。应用函数而不是嵌套循环if语句

我对使用函数族是相当新的。我通常使用循环,但我听说使用apply函数而不是嵌套for循环要快得多。我尝试了一些教程,但仍未能用apply函数替换嵌套for循环。任何帮助将不胜感激,下面是我试图改变的代码。

基本上这就是我想要做的: 数据的第一行:从列中获取值+此列的alpha * nextvalue(第2行)+ alpha^2 * column(row3)的nextvalue +列(row4)的alpha^3 *下一个值,直到最后一行。每次我增加Alpha的力量。

所有这些计算都是针对第一行的。现在对于第二行,我将忽略列中的第一个值,但将以相同的方式获取所有后续值。下面是我的代码,它工作正常,但执行时间太长。

#value of alpha 
alpha <- 0.85 

# test_gain is a vector containing values from a column belonging to a data frame 
test_gain <- testdata$Total_rew 

# initialise the variables 
s = 0 
d = rep(0,nrow(testdata)) 

for (i in 1:nrow(testdata[1:4999,])){ 
    d[i] = test_gain[i] 
    for (s in (i+1):nrow(testdata)){ 
    d[i] = d[i] + alpha^(s-i) * test_gain[s] 
    if (alpha^(s-i) < (10^-5)) {next()} 

    } 
} 
+0

什么是伽玛,如果伽玛小于10^-5,为什么不打印? – aichao

+0

通常在R中,您将要矢量化代码并尽可能避免循环。应用系列在代码中有循环。看看有关矢量化的文章 – hedgedandlevered

+0

对不起,这是一个错字。伽马实际上是阿尔法。我现在改变了它。当alpha少于10^-5时,我跳过迭代的唯一原因就是加速整个过程。因为当alpha达到10^-5时,之后的任何内容都会很小,以至于我不需要将它添加到我的余额 –

回答

0

的关键是产生对幂级数alpha的大小N的上三角矩阵,其中N是行中testdata,看起来像这样的数:

1 alpha alpha^2 alpha^3 ... alpha^(N-1) 
0 1 alpha alpha^2 ... alpha^(N-2) 
0 0  1  alpha ... alpha^(N-3) 
0 0  0  1  ... alpha^(N-4) 
...       ... 
0 0  0  0    1 

然后,计算简单地与列testdata$Total_rew的矩阵相乘。

要生成此上三角矩阵(改编自this SO question/answer):

## This will work for both nrow(testdata) is odd and even 
nr <- ceiling(nrow(testdata)/2 - 1) 
mat <- outer(alpha^(-nr:nr), alpha^(-nr:nr)) 
## reverse the columns 
mat <- mat[,rev(seq.int(ncol(mat)))] 
## what we want is in the lower triangular, so set the upper triangular to zeroes 
mat[upper.tri(mat)] <- 0 
## take the transpose so what we want is now upper triangular 
mat <- t(mat) 

然后,

d <- mat %*% testdata$Total_rew 

还要注意的是,你不需要在上面的最后一步转mat。如果您做的最后一步不mat以上,这也将产生相同的结果:

d <- testdata$Total_rew %*% mat 

希望这有助于。

+0

中的test_gain,这当然有帮助,谢谢。我会尝试你建议的方式,看看结果是否与先前使用嵌套循环提取的值匹配。如果这种方式有效,我可以看到它大大减少了我的计算时间 –

+0

我可以建议,为了比较,当alpha ^(s-i)小于10^-5时,不要停止该系列?我也会编辑答案,但这不会影响结果。 – aichao

+0

是的你的权利,我会拿出这行代码,并让它运行过夜。谢谢 –