如何在矩阵中进行三次求和

时间:2014-03-21 03:31:13

标签: r loops matrix sum

我有一个像这样的三重求和表达式

sum(l(from 1 to n))
   sum(i(from 1 to m))
       sum(t(from 1 to m)
          [phil_z1_1[i]*phil_z1_1[t}*I(X(l)<min(y(i),y(t))]

我做了:

set.seed(1234567)    
x <- rnorm(2900)
n <- length(x)
y <- rnorm(3000)*0.25
m <-length(y)    
z1 <- runif(m,min=0,max=1)
z2 <- runif(m,min=0,max=1)   
phil_z1_1 <- sqrt(12*(z1/z2)))

for min(y[i],y[t])我做过像

这样的事情
y_m<-matrix(rep(y,length(y)),ncol=length(y))
y_m_t<-t(y_m)
y_min<-pmin(y_m_t,y_m)

扩展两个内部求和后,例如,m=2,n=3 我可以将原始表达式放入像x*A*x'

这样的矩阵中

其中

x=[phil_z1_1[1] phil_z1_1[2]]
A is a 2*2 matrix 
A=[sum(from 1 to n) I(x[l]<=min(y[1],y[1]), sum(from 1 to n)    I(x[l]<=min(y1,y2); sum(from 1 to n) I(x[l]<=min(y[2],y[1]), sum(from 1 to n) I(x[l]<=min(y[2],y[2])]

因此,

x*A*x'=[phil_z1_1[1] phil_z1_1[2]]*[sum(from 1 to n) I(x[l]<=min(y[1],y[1]), sum(from 1 to n)    I(x[l]<=min(y1,y2); sum(from 1 to n) I(x[l]<=min(y[2],y[1]), sum(from 1 to n) I(x[l]<=min(y[2],y[2])][phil_z1_1[1] phil_z1_1[2]]'

基本上我想为 A 创建am * m矩阵,其中每个单独的元素等于其相应部分的总和,例如,sum(from 1 to n)x[l]<=min(y[1],y[1])将是a11的a11 矩阵A 我想创建

我尝试过使用

args <- expand.grid(l=1:n, i=1:m, t=1:m)
args <- subset(args, x[l] <= pmin(y[i],y[t])-z1[i]*z2[t])
args <- transform(args, result=phil_z1_1[i]*phil_z1_1[t])

sum(args[,"result"])

但是r不能运行上面的编程,因为数据集的样本量太大,大约3000。

有人可以告诉我如何解决这个问题吗?

提前致谢!

1 个答案:

答案 0 :(得分:0)

以下是三元和的矩阵方法

set.seed(1234567)    
n <- 10
x <- rnorm(n)

m <- 3000
y <- rnorm(m)/4
y_m <- pmin(matrix(rep(y,m), ncol=m, byrow=TRUE), y)


z1 <- runif(m,min=0,max=1)
z2 <- runif(m,min=0,max=1)   
phi <- sqrt(12*(z1/z2))
phi_m <- phi %o% phi

f1 <- function(l) sum(phi_m * (x[l] < y_m))
sum(sapply(1:n, f1))
[1] 242034847337

它不是闪电般快,但比data.frame方法快得多

f2 <- function(lrng) {
    args <- expand.grid(l=lrng, i=1:m, t=1:m)
    args <- subset(args, x[l] <= pmin(y[i],y[t]))
    args <- transform(args, result=phi[i]*phi[t])
    sum(args[,"result"])
}
sum(sapply(1:n, f2)) # 90 times slower
[1] 242034847337