首页 > 解决方案 > R - 我怎样才能使这个循环更快?

问题描述

有没有办法让这个循环在 r 中更快?

    V=array(NA, dim=c(nrow(pixDF), n))

    for(i in 1:n)
    {
       sdC<-sqrt(det(Cov[,i,]))
       iC<-inv(Cov[,i,])
       V[,i]<-apply(pixDF,1,function(x)(sdC*exp(-0.5*((x-Mean[i,])%*%iC%*%as.matrix((x-Mean[i,]))))))
    }

其中,在这种情况下,pixDF是一个 490000 行和 4 列填充双精度数的矩阵。n= 5.Cov是一个 (4,5,4) 数组,其中填充了“双打”。Mean也是一个用双精度数填充的 (5,4) 数组。

这个循环在我的电脑上大约需要 30 分钟。(编辑前)。现在需要1分钟。

标签: rperformanceloops

解决方案


正如 Ronak 所指出的,如果没有可重复的示例,就很难提供帮助。但是,我认为这apply是可以避免的。像这样的东西可以工作:

V <- array(NA, dim = c(nrow(pixDF), n))
tpixDF <- t(pixDF)
for (i in 1:n) {
  x <- Cov[, i, ]
  sdC <- sqrt(det(x))
  iC <- solve(x)
  mi <- Mean[i, ]
  k <- t(tpixDF - mi)
  V[, i] <- sdC*exp(-0.5*rowSums(k %*% iC * k))
}

另外,正如罗兰所说,inv可能是平等的solve


推荐阅读