如何在r中向量化复杂的迭代循环

时间:2015-04-23 18:24:15

标签: r vectorization

我通常对r中的矢量化没有问题,但我在下面的例子中遇到了困难,其中for循环中存在迭代和非迭代组件。

在下面的代码中,我有一个必须根据一组常量(Dini)执行的计算,这是一个值向量(Xs),其中输出向量的第i个值(Ys)也取决于i-1值:

Dini=128 #constant
Xs=c(6.015, 5.996, 5.989, 5.911, 5.851, 5.851, 5.858, 5.851)
Y0=125.73251 #starting Y value

Ys=c(Y0) #starting of output vector, first value is known
for (Vi in Xs[2:length(Xs)]){
  ytm1=Ys[length(Ys)]
  y=(955.74301-2*((Dini+ytm1-Vi)^2-ytm1^2)^0.5+2*ytm1*acos(ytm1/(Dini+ytm1-Vi)))/pi/2
  Ys=c(Ys, y)
} 
df=data.frame(Xs, Ys)
df

    Xs       Ys
1 6.015 125.7325
2 5.996 125.7273
3 5.989 125.7251
4 5.911 125.7036
5 5.851 125.6859
6 5.851 125.6849
7 5.858 125.6868
8 5.851 125.6850

对于这种情况,在for循环中混合了迭代和非迭代组件,我的思想在非矢量化结中扭曲。

有什么建议吗?

1 个答案:

答案 0 :(得分:4)

在这种情况下,您可能希望使用IntelliJ。例如

grails intellij plugin

Reduce帮助页面:" Reduce使用二元函数连续组合给定向量的元素和可能给定的初始值。"这样可以更容易地创建给定值取决于先前值的向量。