a
和b
是实数的两个向量。
它们的长度不一定相同。
i
的{{1}}元素与a
的{{1}}元素之间的距离定义为j
如果没有显式循环,您如何计算b
的任何元素与abs(a[i] - b[j])
的任何元素之间的最小距离?
以下是我的所作所为:a
。
然而,我觉得有更好的事情要做......
答案 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, "-")))