成对距离的矩阵

时间:2014-12-28 15:05:58

标签: r distance

我有一组点坐标,我想用它来生成距离矩阵。更具体地说,我有两组点,大小为n的A和大小为m的B,给定为2d坐标,我希望在矩阵之间具有A点和B点之间的所有欧几里德距离,并且没有其他距离。 / p>

编辑:如果情况更复杂怎么办:如果我有我的矩阵怎么办但现在我想把它的每一行除以A中第一个点的欧几里德距离与集合B中所有点的总和:是,规范化每一行距离。有没有一种有效的方法呢?

2 个答案:

答案 0 :(得分:2)

set.seed(101)
n <- 10; m <- 20
A <- data.frame(x=runif(n),y=runif(n))
B <- data.frame(x=runif(m),y=runif(m))

我们想要

sqrt((x_{1,i}-x_{2,j})^2+(y_{1,i}-y_{2,j})^2)

适用于每个i=1:nj=1:m

您可以通过

执行此操作
dists <- sqrt(outer(A$x,B$x,"-")^2 + outer(A$y,B$y,"-")^2)

在这种情况下是10x20矩阵。换句话说,我们发现每对"-"值和每对x值之间的差异(y是对减法运算符的引用),平方,添加和获取平方根。

如果你想按行数对每一行进行标准化,我建议

norm.dists <- sweep(dists,MARGIN=1,STATS=rowSums(dists),FUN="/")

答案 1 :(得分:2)

基础R中的dist(...)函数没有用,因为它计算自动距离(给定数据集中每个点到每个其他点的距离)。你想要跨距离。包dist(...)中有一个proxy函数,专门用于此目的。

使用@BenBolker友情提供的数据集,

library(proxy)   # note that this masks the dist(...) fn in base R...
result <- dist(A,B)
result[1:5,1:5]
#           [,1]      [,2]      [,3]      [,4]      [,5]
# [1,] 0.5529902 0.7303561 0.1985409 0.6184414 0.7344280
# [2,] 0.7109408 0.9506428 0.1778637 0.7216595 0.9333687
# [3,] 0.2971463 0.3809688 0.4971621 0.4019629 0.3995298
# [4,] 0.4985324 0.5737397 0.4760870 0.5986826 0.5993541
# [5,] 0.4513063 0.7071025 0.3077415 0.4289675 0.6761988