【发布时间】:2012-11-09 04:11:55
【问题描述】:
我已经搜索过类似的问题,但我对我应该做什么有一个模糊的想法:将所有内容矢量化或使用apply()family。但是我是R编程的初学者,以上两种方法都很混乱。
这是我的源代码:
x<-rlnorm(100,0,1.6)
j=0
k=0
i=0
h=0
lambda<-rep(0,200)
sum1<-rep(0,200)
constjk=0
wj=0
wk=0
for (h in 1:200)
{
lambda[h]=2+h/12.5
N=ceiling(lambda[h]*max(x))
for (j in 0:N)
{
wj=(sum(x<=(j+1)/lambda[h])-sum(x<=j/lambda[h]))/100
for (k in 0:N)
{
constjk=dbinom(k, j + k, 0.5)
wk=(sum(x<=(k+1)/lambda[h])-sum(x<=k/lambda[h]))/100
sum1[h]=sum1[h]+(lambda[h]/2)*constjk*wk*wj
}
}
}
让我解释一下。我想收集 200 个 sum1 值(这是第一个循环),对于每个 sum1 值,它是 (lambda[h]/2)*constjk*wk*wj 的总和,因此是其他两个循环的总和。最繁琐的是N随h变化,所以我不知道如何向量化j-loop和k-loop。但是我当然可以用lambda<-seq() 和N<-ceiling() 对h-loop 进行矢量化,这是我能做的最好的。有没有办法进一步简化代码?
【问题讨论】:
-
是第一个,基本上我是想计算两个edfs的差,所以是/100。
-
可以在循环外使用向量命令计算 lambda 和 N 值。就是这样。在已知 N 和 lambda 值的情况下,您可能可以在此之后加速 wj 计算,但不会加速太多。 (wj 可能是循环外的两个小
sapply,仅用于求和(xouter 进行 constjk 和 wk 计算,也许会得到更强有力的答案。 -
一般来说,遵循这个规则:如果你的第 j 个计算依赖于 (j-1) 计算的结果,那么你不能向量化。如果没有,你可以。
标签: r nested-loops