2009-10-27 87 views
8

我有两个整数向量,对于第二个向量的每个元素,我想找到与第一个向量的任何元素的最小距离 - 例如找到一个矢量的每个元素与另一个矢量之间的最小差异

obj1 <- seq(0, 1000, length.out=11) 
obj2 <- 30:50 
min_diff <- sapply(obj2, function(x) min(abs(obj1-x))) 
min_diff 

回报

[1] 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 

有没有更有效的方法?我想把这个比例扩大到数千(数百万)的obj1 & obj2。

感谢, 亚伦

+0

我们需要更多信息。这是不同的obj1,obj2或两者?有多少独特的元素? – hadley 2009-10-27 02:12:41

+0

obj1&obj2现在需要扩展到成千上万,将来需要扩展到数百万 - 也不会包含重复项 – 2009-10-27 02:21:33

回答

14

我会使用排序在所述第一向量的阶梯函数。这将避免循环,并且在R.

x <- rnorm(1000) 
y <- rnorm(1000) 
sorted.x <- sort(x) 
myfun <- stepfun(sorted.x, 0:length(x)) 

蛮快的现在myfun(1)会给你其值小于1sorted.x最大元素的索引。就我而言,

> myfun(1) 
[1] 842 
> sorted.x[842] 
[1] 0.997574 
> sorted.x[843] 
[1] 1.014771 

所以,你知道最近的元素是sorted.x[myfun(1)]sorted.x[myfun(1) + 1]。因此(和填充为0),

indices <- pmin(pmax(1, myfun(y)), length(sorted.x) - 1) 
mindist <- pmin(abs(y - sorted.x[indices]), abs(y - sorted.x[indices + 1])) 
2

开始通过排序OBJ1

那么你可以做的OBJ1为obj2的每个元素的二进制搜索。知道元素将在哪里,您可以将距离与obj1的两个附近元素进行比较,为您提供最小距离。

运行时(其中n1 = | OBJ1 |和n2 = | OBJ2 |): (N1 + N2)的日志(N1)

相关问题