العثور على الفرق بين الحد الأدنى لكل عنصر من عناصر مكافحة ناقلات واحد وناقلات أخرى

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

  •  06-07-2019
  •  | 
  •  

سؤال

ولدي متجهين من الأعداد الصحيحة، ولكل عنصر من عناصر مكافحة ناقلات الثاني أريد أن أجد المسافة minumum إلى أي عنصر من عناصر مكافحة ناقلات الأول - على سبيل المثال

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.

وشكرا، هارون

هل كانت مفيدة؟

المحلول

وأود أن استخدام وظيفة خطوة مرتبة على ناقلات الأول. هذا سوف تجنب الحلقات وسريع جدا في R.

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

والآن سوف تعطي myfun(1) لك المؤشر من أكبر عنصر sorted.x قيمتها أقل من 1. في حالتي،

> 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

وبعد ذلك يمكنك القيام بعملية بحث ثنائي في obj1 لكل عنصر من عناصر obj2. مع العلم حيث العنصر سيكون، يمكنك مقارنة المسافة إلى اثنين من العناصر القريبة من obj1، مما يتيح لك الحد الأدنى من المسافة.

ووقت التشغيل (حيث N1 = | obj1 | و n2 = | obj2 |): (N1 + N2) سجل (N1)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top