2014-07-14 23 views
6

Öklid mesafe hesaplamasında çok kayboldum. Bunu yapmak için dist2 {SpatialTools} veya rdist {fields} işlevlerini buldum, ancak beklendiği gibi çalışmıyorlar. x, y? Matrisiyle tanımlanan iki nokta arasındaki Euclidian mesafesinin nasıl hesaplanır?

Sanırım bir nokta carthesian sisteminde iki koordinat var, yani [x, y]. [X 1, y1] noktası B: [X2, Y2]

Nokta koordinasyonlarını:

(satır ile tanımlanan) 2 nokta arasındaki mesafeyi, I 4 2 puan için koordinat, yani A noktası mi ölçmek için x1 (A ve C, orada satır tarafından tanımlanan) ve x2 (B ve D içeren):

Points position

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

iki matrisler. matris içinde yazılı:

> 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 
012: I EuclidDist elde etmek için kabul

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

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) 

yüzden arasında Öklid mesafe hesaplamak için

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

elde

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

sorum olan, gerçek Öklid tarif numaraları:Sadece tarafından tanımlanan iki nokta arasındaki mesafelerin vektörünü elde etmek istiyorum [x, y] Bir matrisi elde dist2 kullanılarak, ancak, koordinatları AB ve CD arasındaki bu matris arasındaki mesafe? Bir şeyi yanlış anladım mı? Her tavsiye ya da açıklama için çok teşekkür ederim.

cevap

10

Sadece bir vektör istiyorsanız, bunun gibi bir şey sizin için çalışacaktır. Böyle

deneyin şey:

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

Bu, herhangi bir boyut için çalışacaktır. (Böyle çeşitli görevler için çok kolay çünkü) ben foreach öneriyoruz rağmen

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

: foreach kullanmak istemiyorsanız

, basit bir döngü kullanabilirsiniz. Bu paketin belgelerinde daha fazla bilgi edinin.

+0

işleri teşekkürler, döngü çok faydalı, işe yarıyor! : -D – maycca

+0

Eşit olmayan uzunluklarda iki matris varsa ne olur? 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 = TRUE) –

0

Köşegen aradığınız şeydir. dist2'un çıktı matrisi, tüm noktalar arasındaki mesafeyi gösterir. Çıkıştaki satır numarası, birinci girdideki satıra karşılık gelir ve çıktının sütunu, ikinci girişteki satıra karşılık gelir. İşte şeması var, mantıklı (bu tür şeyler ı yığın taşması için MathJax desteklenen dilek) yapar umut: Senin durumunda

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 

, sen ilk noktaya x1 ilk noktadan mesafeyi istiyorum x2, daha sonra x1'un ikinci noktasını x2'un ikinci noktasına kadar, dolayısıyla köşegen.

> 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 

Bir sürü arasında var ise: Eğer çok fazla veri varsa ve sadece karşılık gelen çiftler umursuyorsanız

, bu da doğrudan hesaplama çok daha iyi olacağım Veriler (milyonlarca puan), @Shambho'nun önerdiği gibi foreach'u kullanmaya değer olabilir.

+0

sayesinde, bu benim bütün veri kümesi için çalışacağız :) Büyük – maycca

-1

Her zamanda gerçek denklemini uygulayabilirsiniz (sqldf paketi için yazılmıştır, ancak kolayca dönüştürülebilir):

sum(SQRT(power(a.LONG-b.lon,2)+power(a.LAT-b.lat,2))) AS DISTANCE 
İlgili konular