العثور على الفرق بين الحد الأدنى لكل عنصر من عناصر مكافحة ناقلات واحد وناقلات أخرى
-
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)