加快以下步骤:
x <- c(0, 1, 1.1, 1.5, 1.9, 2.8, 2.9, 3.5)
n <- length(x)
temp <- 0
for(i in 1:n) {
for(j in 1:n) {
temp <- temp + dnorm(x[i] - x[j])
}
}
> temp
[1] 13.40157
我可以简单地使用sapply
函数,如下所示:
out <- sapply(x, function(a) dnorm(x - a)))
sum(out)
> sum(out)
[1] 13.40157
但是如何对matrix, not vector
使用相同的技巧,我需要加快以下速度:
x <- matrix(c(3, 3.3, 5, 6, 7, 4), nrow=3, ncol=2, byrow=FALSE)
n <- length(x[,1])
library(mvtnorm) # for dmvnorm
temp <- 0
for(i in 1:n) {
for(j in 1:n) {
temp <- temp + dmvnorm(x[i,] - x[j,])
}
}
> temp
[1] 0.6686979
答案 0 :(得分:4)
在3x3的情况下,您需要从以下成对行计算密度:
1,1
1,2
1,3
2,1
2,2
2,3
3,1
3,2
3,3
我会通过生成一个矩阵来实现这一点,其中每一行对应每对中的第一个元素,一个矩阵,其中每一行对应于每对中的第二个元素,减去两个,然后将结果传递给{{1} }:
dmvnorm
这似乎比使用循环的方法更快:
mat1 <- x[rep(1:n, each=n),]
mat2 <- x[rep(1:n, n),]
sum(dmvnorm(mat1-mat2))
# [1] 0.6686979
对于这个100 x 10的例子,使用矢量化方法的速度超过了100倍。