3

ab是实数的两个向量。

它们不一定具有相同的长度。

i的第 th 元素a和 的j第 th 元素之间的距离b定义为abs(a[i] - b[j])

如果没有显式循环,您将如何计算 的任何元素a与 的任何元素之间的最小距离?b

这是我所做的min(sapply(X=1:length(b), FUN=function(x) abs(a - b[x])))

但是,我觉得有更好的事情要做......

4

3 回答 3

4

我会使用该dist函数创建一个距离矩阵,然后找到其中的最小距离。这可能比 R 中的显式循环(包括sapply)要快得多。

a = runif(23)
b = runif(10)
d_matrix = as.matrix(dist(cbind(a,b)))
d_matrix[d_matrix == 0] <- NA
sqrt(min(d_matrix, na.rm = TRUE))

请注意,cbind循环使用较小的向量。所以这个函数可能不是最优的,但对于大小差异不大的向量,仍然比显式循环快得多。

并找出哪一对元素有这个距离(尽管回收在这里引入了一些挑战):

which(d_matrix == min(d_matrix, na.rm = TRUE), arr.ind = TRUE)
于 2013-05-30T05:25:40.277 回答
3

这是一个尝试:

a <- c(9,5,6); b <- c(6,9)
# a
#[1] 9 5 6
# b
#[1] 6 9

combos <- sapply(b,function(x) abs(x-a))
# or an alternative
combos <- abs(outer(a,b,FUN="-"))

然后,您可以通过以下方式获得最小距离:

min(combos)

如果您想获得最小值的相应索引,您可以执行以下操作:

which(combos==min(combos),arr.ind=TRUE)

# each matrix row has the 2 indexes for the minimums
# first column is 'a' index, second is 'b' index
#      row col
# [1,]   3   1
# [2,]   1   2
于 2013-05-30T05:52:56.937 回答
2

单线应该在这里工作:min(abs(outer(a, b, "-")))

于 2013-05-30T06:10:26.563 回答