2014-12-28 275 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