如何找到两个向量的欧几里德距离:
x1 <- rnorm(30)
x2 <- rnorm(30)
答案 0 :(得分:59)
使用dist()
函数,但您需要从dist()
的第一个参数的两个输入形成一个矩阵:
dist(rbind(x1, x2))
对于OP问题中的输入,我们得到:
> dist(rbind(x1, x2))
x1
x2 7.94821
单个值,即x1
和x2
之间的欧几里德距离。
答案 1 :(得分:34)
正如Wikipedia所定义的那样,应该这样做。
euc.dist <- function(x1, x2) sqrt(sum((x1 - x2) ^ 2))
rdist
包中的fields
函数可能很有用。请参阅here。
编辑:将**
运算符更改为^
。谢谢,加文。
答案 2 :(得分:12)
尝试使用:
sqrt(sum((x1-x2)^2))
答案 3 :(得分:0)
如果您想使用更少的代码,也可以在stats
package中使用norm
(“ F”代表Forbenius, which is the Euclidean norm):
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