我有一组点坐标,我想用它来生成距离矩阵。更具体地说,我有两组点,大小为n的A和大小为m的B,给定为2d坐标,我希望在矩阵之间具有A点和B点之间的所有欧几里德距离,并且没有其他距离。 / p>
编辑:如果情况更复杂怎么办:如果我有我的矩阵怎么办但现在我想把它的每一行除以A中第一个点的欧几里德距离与集合B中所有点的总和:是,规范化每一行距离。有没有一种有效的方法呢?
答案 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:n
和j=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