【发布时间】:2020-02-20 14:20:53
【问题描述】:
有没有办法让这个循环在 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 分钟。
【问题讨论】:
-
为什么
pixDF不是矩阵?你在apply循环中做了很多事情,这些事情只需要在周围的for循环中计算一次,例如,sqrt(det(Cov[,i,]))不需要为pixDF的每一行单独计算。跨度> -
如果您将可重现的示例与预期输出一起包含在内,会更容易提供帮助。请阅读有关how to ask a good question 的信息以及如何提供reproducible example。
-
@Roland 我不知道矩阵的内存效率更高。在
apply之外计算sqrt(det(Cov[,i,]))并使用矩阵而不是 data.frame 后并没有太大变化,但在计算inv(Cov[, i ,])之前使其更快(60秒)。非常感谢。 -
我不知道
inv函数,但如果它确实如其名称所述,让我指出对数字的一般建议:避免反转矩阵。这是昂贵的,并且会产生(损失)精度的问题。通常情况下,最好solve方程系统。
标签: r performance loops