R-如何使这个循环更快?

时间:2019-10-24 09:14:14

标签: r performance loops

是否有某种方法可以使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分钟。

1 个答案:

答案 0 :(得分:0)

正如罗纳克(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