【问题标题】:how to do triple summations in matrices如何在矩阵中进行三重求和
【发布时间】:2014-03-21 03:31:13
【问题描述】:

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

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)))

对于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创建一个m*m矩阵,其中每个单独的元素都等于其对应部分的总和,例如sum(from 1 to n)x[l]&lt;=min(y[1],y[1])将是矩阵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左右。

谁能告诉我如何解决这个问题?

提前致谢!

【问题讨论】:

  • X 函数是什么?为什么要在这样的表达式中使用I()?我怀疑您将数学函数符号与 R 索引混合在一起。你没有y 函数,但有一个y 向量,所以需要写:y[t]。 (而 3,000 是一个很小的数据集。)
  • 你可能应该用一两个循环制作一个小得多的测试示例,以确保你掌握了 R 语法的基础知识。

标签: r loops matrix sum


【解决方案1】:

这是您的三重和的矩阵方法

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 2011-06-16
    相关资源
    最近更新 更多