我有一个非常简单的问题。
给定一个N维点(例如,一个向量,其中每个元素代表一个维度)表示为x
,以及一个MxN维矩阵(或具有N维的M个点的组合!)表示为y
。
set.seed(999)
data <- matrix(runif(1100), nrow = 11, ncol = 10)
x <- data[1, ]
y <- data[2:nrow(data), ]
我想要计算 x
和每个点的距离度量 y
。我知道一种简单的方法是这样做:
distances <- dist(rbind(x, y))
然而,针对这种特殊情况,我认为这并不是非常有效,原因如下:
- 我需要使用rbind函数,它会占用大量内存。
dist
计算每个点之间的距离,但我只对其中10个距离感兴趣,或者说只对y
中每个点与x
之间的距离感兴趣,我不关心y
中各点之间的距离。- 由于上条原因,我需要手动选择距离矩阵的最后一行来获取我实际需要的距离。
y
手动应用距离测量。distances <- apply(y, MARGIN = 1, function(a, b = x) {
sqrt(sum((a - b)^2))
})
然而,当我对这两种方法进行计时时,得到的结果是:
func1 <- function(x, y) {
apply(y, MARGIN = 1, function(a, b = x) {
sqrt(sum((a - b)^2))
})
}
func2 <- function(x, y) {
dist(rbind(x, y))
}
microbenchmark::microbenchmark(
func1(x, y),
func2(x, y)
)
Unit: microseconds
expr min lq mean median uq max neval
func1(x, y) 29.602 30.450 61.21791 31.301 32.3510 2916.101 100
func2(x, y) 15.101 15.801 28.55304 17.201 17.7015 1143.001 100
所以我的问题是:有没有一种比使用
dist
更快的方法来解决这个问题?