2011-03-28 96 views
0

双总和我想计算这些量到编码中的R

a12=sum_(i from 1 to m)sum_(j1<j2)(I(X[i]>Y[j1] and X[i]>Y[j2])) 

a13=sum_(j from 1 to n)sum_(i1<i2)(I(X[i1]>Y[j] and X[i2]>Y[j])) 

其中I是指标函数。

所以我想出了这个R代码里面

a12=0; a13=0 

for (l in 1:(length(Z1)-1)){ 

for (m in 1:(length(Z2)-1)){ 

a12<-a12+(Z1[l]<Z2[m])*(Z1[l+1]<Z2[m])*1 

a13<-a13+(Z1[l]<Z2[m])*(Z1[l]<Z2[m+1])*1 

     } # closing m 

      } # closing l 

    a12=a12+sum((Z1[-length(Z1)]<Z2[length(Z2)])*(Z1[-1]<Z2[length(Z2)])*1) 

    a13=a13+sum((Z1[length(Z1)]<Z2[-length(Z2)])*(Z1[length(Z1)]<Z2[-1])*1) 


a12; 
a13 

不幸的是,这不仅是非常缓慢的,但我没有得到什么,我应该得到的。

请问你能帮助我吗?

感谢,

罗兰

+1

例子和'Z2'服用z下部三角形的总和得到最终结果和你所期望的结果将有助于。 – 2011-03-28 21:26:00

+0

也解释你的双倍更好。 j1和j2只有在你在a12中使用它们之后才被定义**。你到底想要做什么?链接到一张纸或更好的公式也会有所帮助。 – 2011-03-28 21:45:30

+0

@Joris我认为'Sum_(j1 2011-03-29 02:22:38

回答

5

我假设(对a12)要做到以下几点。你有两个向量x(长度m)和y,以及用于x[i]x每个元素,你正在计算不同 指数对j1y使得x[i]超过既y[j1]y[j2]j2数,,然后被求和这个数量全部为i。 这里有一个快速的方法来做a12(另一个将作为练习)。你可以翻转求和的顺序首先要注意:

a12 = Sum_(j1 < j2) Sum_(i=1:m) I(X[i] > Y[j1] & X[i] > Y[j2]), 

即针对每个不同的指数对j1,j2,我们计算出超过两y[j1]y[j2],然后我们在所有这些总结这个量x元素的数量不同的索引对。现在计算j1,j2对的内部总和就像是一个矩阵乘法。事实上,假如我们定义矢量xy

set.seed(1) 
x <- sample(1:5,5,T) 
y <- sample(1:5,10,T) 

那么我们就可以用outer函数产生一个矩阵y_x[i,j]项为真当且仅当y[i] < x[j]:现在

y_x <- outer(y,x,FUN = '<') 

我们得到通过做内部汇款

z <- y_x %*% t(y_x) 

其中z[i,j]x的元素数超过y[i]y[j]。因为我们只想总结z[i,j]为不同i < j,我们通过使用Z1`的`

a12 <- sum(z[lower.tri(z)]) 

> a12 
[1] 72 
+0

不知道你的评论意味着什么......另外,我还添加了详细的解释。 .. – 2011-03-29 02:21:19