R:矢量a的元素与矢量b的元素之间的最小距离

时间:2013-05-29 17:55:54

标签: r

ab是实数的两个向量。

它们的长度不一定相同。

i的{​​{1}}元素与a的{​​{1}}元素之间的距离定义为j

如果没有显式循环,您如何计算b的任何元素与abs(a[i] - b[j])的任何元素之间的最小距离?

以下是我的所作所为:a

然而,我觉得有更好的事情要做......

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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

答案 2 :(得分:2)

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