2014-07-14 9 views
6

मैं यूक्लिडियन दूरी गणना में बहुत खो गया हूं। ऐसा करने के लिए मुझे फ़ंक्शन dist2 {SpatialTools} या rdist {फ़ील्ड} मिल गए हैं, लेकिन वे अपेक्षित काम नहीं करते हैं।एक्स, वाई युक्त मैट्रिक्स द्वारा परिभाषित दो बिंदुओं के बीच यूक्लिडियन दूरी की गणना कैसे करें?

मुझे लगता है कि एक बिंदु में कार्थेसियन प्रणाली में दो निर्देशांक हैं, इसलिए [x, y]। [X1, y1] बिंदु बी: [x2, y2]

अंक में समन्वयन:

2 अंक के बीच की दूरी (पंक्ति द्वारा परिभाषित), मैं 2 अंक के लिए 4 निर्देशांक, इसलिए बिंदु A जरूरत को मापने के लिए x1 (ए और सी देखते हैं, पंक्तियों द्वारा परिभाषित) और x2 (बी और डी होते हैं):

Points position

A[0,1] 
B[0,0] 
C[1,1] 
D[1,1] 

मैं दो मैट्रिक्स की है। मैट्रिक्स में लिखा:

library("SpatialTools") 
x1<-matrix(c(0,1,1,1), nrow = 2, ncol=2, byrow=TRUE) 
x2<-matrix(c(0,0,1,1), nrow = 2, ncol=2, byrow=TRUE) 

तो मैं

> x1 
    [,1] [,2] 
[1,] 0 1 #(as xy coordinates of A point) 
[2,] 1 1 #(same for C point) 

> x2 
    [,1] [,2] 
[1,] 0 0 #(same for B point) 
[2,] 1 1 #(same for D point) 

प्राप्त के बीच इयूक्लिडियन दूरी की गणना करने के

A <-> B # same as x1[1,] <-> x2[1,] 
C <-> D # same as x1[2,] <-> x2[2,] 

मैं EuclidDist प्राप्त करने के लिए मान लेते हैं:

> x1       x2       EuclidDist 
    [,1] [,2]      [,1] [,2] 
[1,] 0 1 #A   [1,] 0 0 #B    1 
[2,] 1 1 #B   [2,] 1 1 #D    0 

मैं सिर्फ दो अंक से पहचान के बीच दूरी की वेक्टर प्राप्त करने के लिए चाहते हैं [एक्स, वाई] निर्देशांक, तथापि, dist2 का उपयोग कर मैं एक मैट्रिक्स प्राप्त:

> dist2(x1,x2) 
     [,1] [,2] 
[1,] 1.000000 1 
[2,] 1.414214 0 

मेरा प्रश्न है, जो संख्या वास्तविक इयूक्लिडियन का वर्णन इस मैट्रिक्स से एबी और सीडी के बीच की दूरी? क्या मैं कुछ गलत समझ रहा हूँ? हर सलाह या किसी स्पष्टीकरण के लिए बहुत बहुत धन्यवाद।

उत्तर

10

यदि आप सिर्फ वेक्टर चाहते हैं, तो ऐसा कुछ आपके लिए काम करेगा। इस तरह

कोशिश कुछ:

euc.dist <- function(x1, x2) sqrt(sum((x1 - x2)^2)) 

library(foreach) 
foreach(i = 1:nrow(x1), .combine = c) %do% euc.dist(x1[i,],x2[i,]) 

यह किसी भी आयाम के लिए काम करेंगे। ,

dist <- NULL 
for(i in 1:nrow(x1)) dist[i] <- euc.dist(x1[i,],x2[i,]) 
dist 

हालांकि मैं foreach की सिफारिश करेंगे (यह बहुत इस तरह विभिन्न कार्यों के लिए आसान है क्योंकि):

आप foreach का उपयोग नहीं करना चाहते हैं, आप एक सरल पाश का उपयोग कर सकते हैं। पैकेज के दस्तावेज़ीकरण में इसके बारे में और पढ़ें।

+0

महान , धन्यवाद, पाश बहुत उपयोगी है, यह काम करता है! :- डी – maycca

+0

क्या होगा यदि दो matrices हैं जो असमान लंबाई हैं ?? 'x1 <-matrix (सी (0,1,1,1,2,1), nrow = 3, ncol = 2, byrow = TRUE) x2 <-matrix (c (0,0,1,1), nrow = 2, ncol = 2, बाई = सही) ' –

0

विकर्ण वह है जिसे आप ढूंढ रहे हैं। dist2 का आउटपुट मैट्रिक्स सभी बिंदुओं के बीच की दूरी दिखाता है। आउटपुट में पंक्ति संख्या पहले इनपुट में पंक्ति से मेल खाती है, और आउटपुट का कॉलम दूसरे इनपुट में पंक्ति से मेल खाता है। यहाँ एक चित्र है, आशा है कि यह समझ में (इस बात की तरह है मैं स्टैक ओवरफ़्लो के लिए समर्थित MathJax इच्छा) बनाता है:

dist2(A_x A_y  C_x C_y  (AC AD 
     B_x B_y , D_x D_y) = BC BD) 

dist2( x1  ,  x2 ) = result 

आपके मामले में, आप का पहला बिंदु को x1 का पहला बिंदु से दूरी चाहते x2, फिर x1 का दूसरा बिंदु x2 के दूसरे बिंदु पर, इसलिए विकर्ण।

> x1 <- matrix(c(0, 1, 1, 1), ncol = 2, byrow = T) 
> x2 <- matrix(c(0, 0, 1, 1), ncol = 2, byrow = T) 
> sqrt(rowSums((x1 - x2)^2)) 
[1] 1 0 

आप के बहुत मिल गया है, तो:

आप डेटा की एक बहुत कुछ है, और आप केवल इसी जोड़े के बारे में परवाह, तो आप इस सीधे की गणना बंद काफी बेहतर हो जाएगा डेटा (लाखों अंक), foreach जैसे @Shambho का उपयोग करने के लायक हो सकता है।

+0

धन्यवाद, यह काम करता है, मैं इसे अपने पूरे डेटासेट के लिए कोशिश करेंगे :) – maycca

-1

तुम हमेशा सिर्फ सच समीकरण आवेदन कर सकते हैं (sqldf पैकेज के लिए लिखा है, लेकिन यह आसानी से बदला जा सकता है):

sum(SQRT(power(a.LONG-b.lon,2)+power(a.LAT-b.lat,2))) AS DISTANCE 
संबंधित मुद्दे