a
b
是实数的两个向量。
它们不一定具有相同的长度。
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])))
:
但是,我觉得有更好的事情要做......
a
b
是实数的两个向量。
它们不一定具有相同的长度。
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])))
:
但是,我觉得有更好的事情要做......
我会使用该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)
这是一个尝试:
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
单线应该在这里工作:min(abs(outer(a, b, "-")))