Here is the image showing what i need to calculate。对不起,图片中的total_r实际上是代码中的test_gain,而pic中的gamma是指代码中的alpha(对不起)。同样在图像中我停止在t = 3计算,但实际上我想计算它直到最后一个值为0.6。
我很擅长使用apply系列函数。我通常使用循环,但我听说使用apply函数而不是嵌套for循环要快得多。我尝试了几个教程,但仍然无法用apply函数替换我的嵌套for循环。任何帮助将不胜感激,下面是我试图改变的代码。
基本上这就是我要做的事情: 数据的第一行:从列的列+ alpha * nextvalue获取值(第2行)+ alpha ^ 2 * column(row3)的nextvalue + alpha ^ 3 * column(row4)的下一个值,依此类推最后一排。每次我增加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 :(得分:0)
关键是生成N
幂级数alpha
的大小为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 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
列。
生成此上三角矩阵(改编自this SO question/answer):
mat
然后,
mat
另请注意,您无需在上一步中转置d <- testdata$Total_rew %*% mat
。如果您在上一步中不转置To complete the registration process, click the http://xxx/#/confirmation?confirmationCode=OGM0Njg2ODktOTY0Ni00ZDViLTkzYWUtYjQzYzllMjY3NjMw
,则也会得到相同的结果:
To complete the registration process, click the http://xxx/#/confirmation?confirmationCode=OGM0Njg2ODktOTY0Ni00ZDViLTkzYWUtYjQzYzllMjY3NjMw
希望这有帮助。