distm
fromを使用して、非常に大きな行列内のすべての点間の距離を計算したいと思いgeosphere
ます。
最小限の例を参照してください。
library(geosphere)
library(data.table)
coords <- data.table(coordX=c(1,2,5,9), coordY=c(2,2,0,1))
distances <- distm(coords, coords, fun = distGeo)
問題は、計算している距離の性質によりdistm
、対称行列が返されるため、距離の半分以上を計算することを回避できることです。
structure(c(0, 111252.129800202, 497091.059564718, 897081.91986428,
111252.129800202, 0, 400487.621661164, 786770.053508848, 497091.059564718,
400487.621661164, 0, 458780.072878927, 897081.91986428, 786770.053508848,
458780.072878927, 0), .Dim = c(4L, 4L))
それぞれ2回行うことを避けて、これらすべての距離を計算するためのより効率的な方法を見つけるのを手伝ってもらえますか?
ポイントのすべてのペアワイズ距離を計算する場合x
は、を使用するdistm(x)
よりも使用することをお勧めしますdistm(x,x)
。このdistm
関数はどちらの場合も同じ対称行列を返しますが、1つの引数を渡すと、行列が対称であることがわかるため、不要な計算は行われません。
あなたはそれを計ることができます。
library("geosphere")
n <- 500
xy <- matrix(runif(n*2, -90, 90), n, 2)
system.time( replicate(100, distm(xy, xy) ) )
# user system elapsed
# 61.44 0.23 62.79
system.time( replicate(100, distm(xy) ) )
# user system elapsed
# 36.27 0.39 38.05
Rコードを見geosphere::distm
て、2つのケースの処理が異なることを確認することもできます。
余談ですが、グーグルですばやく検索するとparallelDist
、CRANでの平行距離行列の計算が見つかります。測地線距離はオプションです。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加