我附带了一个最小示例,用于计算从一个随机采样的中心到每个数据点的距离。我还没有在R中使用C ++或并行计算的经验,但是我最不确定这些解决方案中的哪一个是解决我的问题的最佳方法(在这里和那里有人声称您应该在任何时候进行并行化,有人声称几乎没有必要并行化) ,一些建议,一些反对使用Rcpp的建议)。与生活中的大多数事情一样,我确信在某些情况下所有这些答案都是正确的。但是,什么情况下通常采用哪种方法?
((我分析了此代码,仅在R代码中找不到我可以提高的速度。但是,如果您有任何建议,也请让我知道!)
x <- matrix(runif(15000*34),nrow = 15000, ncol = 34)
w <- matrix(runif(15000*17),nrow = 15000, ncol = 17)
k <- 3
i <- 1
centers <- x[sample.int(nrow(x), size = k),]
weighted_matching <- function(point,center,weight){
point <- matrix(point, ncol = 2, nrow = 17, byrow = T)
center <- matrix(center, ncol = 2, nrow = 17, byrow = T)
1/sum(weight) * sum(weight * apply(point, 1, function(x,y) sqrt(sum((x-y)^2)), y = center))
}
system.time(
apply(x, 1, weighted_matching, weight = w, center = centers[i,])
)
然而,第二点可能是有益的;实际上,您正在计算(x-y)^2
,它将创建两个新的临时向量。最好使用C ++重写此代码,以使用更少的内存,并可能使计算时间提高2-3倍。
但是,当我通常听到“计算距离”时,我可能会去尝试使用矩阵计算(线性代数)来得出。