有一个向量“x”和一个矩阵“y”
您需要快速计算“x”与矩阵“y”的每一行之间的欧氏距离
我通过编写自己的函数取代了标准函数“dist()”
штатная
system.time(for(i in 1:nrow(m)) {dist.ve[i] <- dist(rbind(x,m[i,]))})
user system elapsed
4.38 0.00 4.39
самописная
system.time(for(i in 1:nrow(m)) {dist.ve[i] <- euc.dist(x,m[i,])})
user system elapsed
0.65 0.00 0.67
但这还不够,我想加速到第二个零 0.0....
你还能想到什么?编码:
x <- rnorm(10)
m <- matrix(data = rnorm(1000000),ncol = 10)
euc.dist <- function(x1, x2) sqrt(sum((x1 - x2) ^ 2))
dist.ve <- rep(0,nrow(m)) # distance vector
system.time(for(i in 1:nrow(m)) {dist.ve[i] <- dist(rbind(x,m[i,]))})
system.time(for(i in 1:nrow(m)) {dist.ve[i] <- euc.dist(x,m[i,])})
您可以通过将函数编译成字节码来加速您的版本。
您也可以用 C++ 重写代码。在这种情况下,糖功能就足够了
Rcpp
。不使用句法“糖”的等效代码:
性能比较代码:
比较结果:
如您所见,尽管仅使用了本机 R 代码,但编译版本
euc_dist2
( ) 本身非常有价值。euc_dist2_c
如果您需要大大加快速度,可以使用
RcppParallel
.