Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 求一个向量和另一个向量的每个元素之间的最小差_R - Fatal编程技术网

R 求一个向量和另一个向量的每个元素之间的最小差

R 求一个向量和另一个向量的每个元素之间的最小差,r,R,我有两个整数向量,对于第二个向量的每个元素,我想找到到第一个向量的任何元素的最小距离,例如 obj1 <- seq(0, 1000, length.out=11) obj2 <- 30:50 min_diff <- sapply(obj2, function(x) min(abs(obj1-x))) min_diff 有没有更有效的方法?我想将obj1和obj2的规模扩大到数千(百万?) 谢谢, Aaron从排序obj1开始 然后可以在obj1中对obj2的每个元素进行二进制

我有两个整数向量,对于第二个向量的每个元素,我想找到到第一个向量的任何元素的最小距离,例如

obj1 <- seq(0, 1000, length.out=11)
obj2 <- 30:50
min_diff <- sapply(obj2, function(x) min(abs(obj1-x)))
min_diff
有没有更有效的方法?我想将obj1和obj2的规模扩大到数千(百万?)

谢谢, Aaron

从排序obj1开始

然后可以在obj1中对obj2的每个元素进行二进制搜索。知道元素的位置后,可以将距离与obj1的两个相邻元素进行比较,从而获得最小距离

运行时(其中n1=| obj1 |和n2=| obj2 |):
(n1+n2)log(n1)

我将使用按第一个向量排序的步长函数。这将避免循环,并且在R中非常快

x <- rnorm(1000)
y <- rnorm(1000)
sorted.x <- sort(x)
myfun <- stepfun(sorted.x, 0:length(x))
因此,您知道最近的元素是
sorted.x[myfun(1)]
sorted.x[myfun(1)+1]
。因此(填充为0)

索引回复张杰:
感谢您提供强大而快速的解决方案

对于我使用您的4行代码,我需要找到最小差异(以检查是否可以接受):

这是一个“愚蠢”的错误,几年后我才注意到。我想选取差异较小的值。。。我打赌你会看到的

min_diff.idx = which.min(mindist)
sorted.x[indices[min_diff.idx]]

由于mindist check sorted.x[索引]和sorted.x[索引+1]同时进行,它们可能会对idx造成混淆,因为这两个比较具有相同的索引

例子: 如果指数为55,56
正念者将检查55,56(指数)和56,57(指数+1)
如果正念者发现最小值为56,但在指数+1(56)内,则为57

有没有办法保存正确的索引?

我们需要更多信息。哪个是变化的obj1、obj2或两者?有多少个独特的元素?obj1和obj2现在需要扩展到数万个,将来需要扩展到数百万个,而且两者都不包含重复的元素
> myfun(1)  
[1] 842
> sorted.x[842]
[1] 0.997574
> sorted.x[843]
[1] 1.014771
indices <- pmin(pmax(1, myfun(y)), length(sorted.x) - 1)
mindist <- pmin(abs(y - sorted.x[indices]), abs(y - sorted.x[indices + 1]))
min_diff.val = min(mindist)

min_diff.idx = which.min(mindist)
sorted.x[indices[min_diff.idx]]