2014-12-28 230 views
0

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

编辑:如果情况更复杂会怎么样:如果我有我的矩阵,但是现在我想将它的每一行除以A中第一个点的欧几里得距离和B中所有点的和:即规格化每一行距离。有没有一种有效的方式来做到这一点?

+1

它看起来并不像你学到了很多关于SO张贴问题[自您上次的问题(http://stackoverflow.com/questions/ 27676815/very-specific-vectorisation-in-r)...虽然你可以看看'?dist' –

+0

我的问题到底出了什么问题?你能指定吗?我会知道供将来参考。 – user132290

+0

阅读[** this **](http://stackoverflow.com/help/how-to-ask)和[** this **](http://stackoverflow.com/questions/5963269/how-to -ma-r-reproducible-example) –

回答

1
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) 

在这种情况下是一个10×20矩阵做到这一点。换句话说,我们发现每对x值和每对y值之间的差异("-"是减法运算符的参考),平方,相加和取平方根。

如果你想通过它的和规范化的每一行,我会建议

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

你能解释一下“ - ”的含义是什么,还有什么可以放在那里? – user132290

+0

只是出于好奇:如果我想要一个与距离不同的函数,我会做什么,只是坐标的任意函数? – user132290

+0

如果你可以将它分解成标量上的成对运算,那么你可以使用'outer()'和一个不同的函数。如果你想一般计算函数f(x_ {1i},x_ {2j},y {1i},y_ {2j})',那么很难高效地进行矢量化。你能给个例子吗? (PS:似乎@ jlhoward的建议'proxy :: dist()'带有一个任意函数。) –

1

在基础R的dist(...)功能不会有帮助,因为它计算的自动距离(距离每点每给定数据集中的其他点)。你想要跨距。在proxy包中有dist(...)函数,它是为此设计的。

使用@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