如何为矩阵使用sapply函数(或类似函数),而不是向量?

时间:2015-05-16 23:29:34

标签: r

加快以下步骤:

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

1 个答案:

答案 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倍。