1つのベクトルの各要素と別のベクトルの最小差を見つける

StackOverflow https://stackoverflow.com/questions/1628383

  •  06-07-2019
  •  | 
  •  

質問

整数の2つのベクトルがあり、2番目のベクトルの各要素について、最初のベクトルの任意の要素までの最小距離を見つけたい-たとえば

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と&amp;の両方に拡大したいobj2。

ありがとう、 アーロン

役に立ちましたか?

解決

最初のベクトルでソートされたステップ関数を使用します。これにより、ループが回避され、Rでかなり高速になります。

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

Now myfun(1)は、値が 1 より小さい sorted.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]))

他のヒント

obj1のソートから開始

その後、obj2の各要素に対してobj1でバイナリ検索を実行できます。要素がどこにあるかがわかっているので、obj1の近くの2つの要素との距離を比較して、最小距離を取得できます。

runtime(n1 = | obj1 |およびn2 = | obj2 |): (n1 + n2)log(n1)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top