r - 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分钟。
解决方案
正如 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
。
推荐阅读
- c++ - Node-Addon-Api 传递数组作为函数参数
- angular - 如何使有角度的材质 sidenav 出现在主视图上?
- r - 从单个 rnorm 函数调用返回平均值和标准差
- javascript - 如何使用 spawn 运行和停止子服务器 node.js?
- customization - Odoo 11 CE 中的自定义活动(待办事项)
- javascript - 动态禁用选择字段条件是如果我们更改另一个选择字段
- c# - 如何在不压缩的情况下将文件和文件夹捆绑到一个单元中?
- python - 当一个数据框为空时,迭代两个熊猫数据框错误
- c++ - 血管的质心opencv
- node.js - 如何使用 Node JS 在 Google 分析中添加交易(电子商务)?