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