a
和 b
是两个实数向量。它们的长度不一定相同。
定义
a
的第 i
个元素和 b
的第 j
个元素之间的距离为 abs(a[i] - b[j])
。不使用显式循环,您将如何计算
a
的任何元素和 b
的任何元素之间的最小距离?这是我的做法:
min(sapply(X=1:length(b), FUN=function(x) abs(a - b[x])))
。然而,我感觉还有更好的方法...
a
和 b
是两个实数向量。a
的第 i
个元素和 b
的第 j
个元素之间的距离为 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
和b
的长度不相等时,cbind
将简单地重复较小的向量。因此,min(d_matrix)
仍将返回最小值。我修改了我的示例。 - Paul Hiemstra以下是一个尝试:
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, "-")))