Евклидово расстояние двух векторов - PullRequest
45 голосов
/ 06 апреля 2011

Как мне найти евклидово расстояние двух векторов:

x1 <- rnorm(30)
x2 <- rnorm(30)

Ответы [ 4 ]

60 голосов
/ 06 апреля 2011

Используйте функцию dist(), но вам нужно сформировать матрицу из двух входов для первого аргумента dist():

dist(rbind(x1, x2))

Для ввода в вопросе ОП мы получим:

> dist(rbind(x1, x2))
        x1
x2 7.94821

единственное значение, которое является евклидовым расстоянием между x1 и x2.

34 голосов
/ 06 апреля 2011

Как определено в Википедии , это должно сделать это.

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

В пакете fields также может быть полезна функция rdist.См. здесь .


РЕДАКТИРОВАНИЕ: Изменен оператор ** на ^.Спасибо, Гэвин.

12 голосов
/ 06 апреля 2011

попробуйте использовать это:

sqrt(sum((x1-x2)^2))
1 голос
/ 15 февраля 2019

Если вы хотите использовать меньше кода, вы также можете использовать norm в пакете stats («F» означает Forbenius, что является евклидовой нормой ):

norm(matrix(x1-x2), 'F')

Хотя это может выглядеть немного лучше, но не быстрее.Действительно, быстрый тест на очень больших векторах показывает небольшую разницу, хотя метод so12311 немного быстрее.Сначала мы определяем:

set.seed(1234)
x1 <- rnorm(300000000)
x2 <- rnorm(300000000)

Затем проверка на время дает следующее:

> system.time(a<-sqrt(sum((x1-x2)^2)))
user  system elapsed 
1.02    0.12    1.18 
> system.time(b<-norm(matrix(x1-x2), 'F'))
user  system elapsed 
0.97    0.33    1.31 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...