2014-07-14 7 views
6

Ich bin sehr verloren in Euklidische Distanzberechnung. Ich habe die Funktionen dist2 {SpatialTools} oder rdist {fields} gefunden, um dies zu tun, aber sie funktionieren nicht wie erwartet.Wie berechnet man den euklidischen Abstand zwischen zwei Punkten, die durch die Matrix definiert sind, die x, y enthält?

Ich nehme an, dass ein Punkt hat zwei Koordinaten in Carthesian System, so [x, y]. Um Abstand zwischen 2 Punkten (definiert durch Reihe) zu messen, ich brauche 4 Koordinaten für 2 Punkte, so Punkt A: [x1, y1] Punkt B: [x2, y2]

Punkte Koordinationen:

Points position

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

ich habe zwei Matrizen: x1 (A und C sind, die durch Reihen definiert) und x2 (enthält B und D). Geschrieben in Matrix:

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) 

so erhalte ich

> 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) 

euklidischen Abstand zwischen Zur Berechnung

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

Ich gehe davon aus EuclidDist zu erhalten:

> 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 

Ich möchte nur Vektor von Distanzen zwischen zwei Punkten zu identifiziere erhalten Koordinaten [x, y] jedoch dist2 Verwendung erhalten I eine Matrix:

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

Meine Frage ist, die Zahlen, die die reale euklidischen beschreiben Abstand zwischen AB und CD von dieser Matrix? Versteh ich etwas falsch? Vielen Dank für jeden Rat oder jede Erklärung.

Antwort

10

Wenn Sie nur einen Vektor möchten, wird so etwas für Sie funktionieren.

versuchen, etwas wie folgt aus:

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,]) 

Dies wird für alle Dimensionen arbeiten.

Wenn Sie nicht foreach verwenden möchten, können Sie eine einfache Schleife verwenden:

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

Obwohl, ich würde foreach empfehlen (weil es sehr einfach ist, für verschiedene Aufgaben wie diese). Lesen Sie mehr darüber in der Dokumentation des Pakets.

+0

Groß Danke, Loop ist sehr nützlich, es funktioniert! :-D – maycca

+0

Was ist, wenn es zwei Matrizen gibt, die ungleich lang sind? 'x1 <-Matrix (c (0,1,1,1,2,1), nrow = 3, ncol = 2, byrow = TRUE) x2 <-Matrix (c (0,0,1,1), nrow = 2, ncol = 2, byrow = WAHR) ' –

0

Die Diagonale ist, was Sie suchen. Die Ausgangsmatrix von dist2 zeigt den Abstand zwischen allen Punkten. Die Zeilennummer in der Ausgabe entspricht der Zeile in der ersten Eingabe und die Spalte der Ausgabe entspricht der Zeile in der zweiten Eingabe. Hier ist ein Diagramm, hofft, dass es sinnvoll ist (dies ist die Art der Sache mag ich Stack-Überlauf unterstützt Mathjax für):

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 

In Ihrem Fall sollten Sie den Abstand von dem ersten Punkt von x1 auf den ersten Punkt von x2, dann der zweite Punkt von x1 bis zum zweiten Punkt x2, daher die Diagonale.

Wenn Sie eine Menge von Daten haben, und Sie kümmern sich nur um den entsprechenden Paaren, werden Sie viel besser dran Berechnung dieser direkt sein:

> 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 

Wenn Sie eine ganze Menge haben von Daten (Millionen von Punkten), könnte es sich lohnen, foreach wie @Shambho suggeriert.

+0

Dank, es funktioniert, ich werde versuchen, es für meine gesamte Datensatz :) – maycca

-1

Sie gelten immer nur die wahre Gleichung (für das sqldf Paket geschrieben, aber es kann leicht umgewandelt werden):

sum(SQRT(power(a.LONG-b.lon,2)+power(a.LAT-b.lat,2))) AS DISTANCE 
Verwandte Themen