2009-10-27 17 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

+0

दोनों obj1 और obj2 को अब हजारों में स्केल करने की आवश्यकता होगी, भविष्य में लाखों - न तो इसमें डुप्लीकेट भी होंगे –

उत्तर

14

मैं पहली बार वेक्टर पर छाँटे गए एक कदम समारोह का प्रयोग करेंगे। यह छोरों से बचने और अब myfun(1) आप sorted.x का सबसे बड़ा तत्व जिसका मूल्य 1 से कम है के सूचकांक दे देंगे आर

x <- rnorm(1000) 
y <- rnorm(1000) 
sorted.x <- sort(x) 
myfun <- stepfun(sorted.x, 0:length(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

छँटाई तो आप obj2 के प्रत्येक तत्व के लिए obj1 में एक द्विआधारी खोज कर सकते हैं द्वारा शुरू। यह जानकर कि तत्व कहां होगा, आप दूरी की तुलना ओबीजे 1 के दो आस-पास के तत्वों की तुलना कर सकते हैं, जिससे आपको न्यूनतम दूरी मिलती है।

क्रम (जहां n1 = | obj1 | और n2 = | obj2 |): (n1 + n2) लॉग (n1)

संबंधित मुद्दे