Как рассчитать евклидово расстояние между двумя точками, определенными матрицей, содержащей x, y?

Я очень запутался в вычислении евклидова расстояния. Я нашел для этого функции dist2 {SpatialTools} или rdist {fields}, но они не работают должным образом.

Я полагаю, что одна точка имеет две координаты в карфесской системе, поэтому [x, y]. Чтобы измерить расстояние между 2 точками (определяется строкой), мне нужны 4 координаты для 2 точек, поэтому точка A: [x1, y1] точка B: [x2, y2]

Координация точек:

Положение точек

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

У меня есть две матрицы: x1 (там A и C, определены строками) и x2 (содержат B и D). Записано в матрице:

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

Я хотел бы просто получить вектор расстояний между двумя точками, идентифицированными координатами [x, y], однако, используя dist2, я получаю матрицу:

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

Мой вопрос: какие числа описывают реальное евклидово расстояние между A-B и C-D от этой матрицы? Я что-то не понимаю? Большое спасибо за каждый совет или любое объяснение.


person maycca    schedule 14.07.2014    source источник


Ответы (3)


Если вам просто нужен вектор, вам подойдет что-то вроде этого.

Попробуйте что-то вроде этого:

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

Это будет работать для любых размеров.

Если вы не хотите использовать foreach, вы можете использовать простой цикл:

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

Хотя я бы порекомендовал foreach (потому что это очень просто для различных задач). Подробнее об этом читайте в документации пакета.

person Shambho    schedule 14.07.2014
comment
Что делать, если есть две матрицы неравной длины ?? 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) - person Manoj Kumar; 13.10.2016

Диагональ - это то, что вы ищете. Выходная матрица dist2 показывает расстояние между всеми точками. Номер строки на выходе соответствует строке на первом входе, а столбец вывода соответствует строке на втором входе. Вот диаграмма, надеюсь, она имеет смысл (я бы хотел, чтобы Stack Overflow поддерживал 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.

person Gregor Thomas    schedule 14.07.2014
comment
Спасибо, работает, попробую для всего набора данных :) - person maycca; 15.07.2014

Вы всегда можете просто применить истинное уравнение (написано для пакета sqldf, но его легко преобразовать):

sum(SQRT(power(a.LONG-b.lon,2)+power(a.LAT-b.lat,2))) AS DISTANCE
person ChrisE    schedule 27.06.2016