大きな入力マトリックス (4000x10000) があります。ユークリッド距離行列を計算するために使用dist()
します (約 5 時間かかります)。
「同じ」マトリックスの距離マトリックスを追加の行で計算する必要があります(4001x10000マトリックスの場合)。行列全体を再計算せずに距離行列を決定する最速の方法は何ですか?
1170 次
1 に答える
2
あなたの余分な行は余分なポイントを意味すると思います。余分な変数/次元を意味する場合は、別の答えが必要になります。
まず、行列のユークリッド距離については、パッケージのrdist
関数をお勧めします。これは Fortran で書かれており、関数fields
よりもはるかに高速です。オブジェクトの代わりに をdist
返しますが、andを使用していつでも一方から他方に移動できます。matrix
dist
as.matrix
as.dist
これが(あなたのものよりも小さい)サンプルデータです
num.points <- 400
num.vars <- 1000
original.points <- matrix(runif(num.points * num.vars),
nrow = num.points, ncol = num.vars)
と、既に計算した距離行列:
d0 <- rdist(original.points)
余分なポイントについては、余分なポイント間の距離と、余分なポイントと元のポイントの間の距離を計算するだけで済みます。追加の 2 つの点を使用して、解が任意の数の追加の点に対して一般的であることを示します。
extra.points <- matrix(runif(2 * num.vars), nrow = 2)
inner.dist <- rdist(extra.points)
outer.dist <- rdist(extra.points, original.points)
したがって、それらをより大きな距離行列にバインドできます。
d1 <- rbind(cbind(d0, t(outer.dist)),
cbind(outer.dist, inner.dist))
完全な長い再実行が生成するものと一致することを確認しましょう。
d2 <- rdist(rbind(original.points, extra.points))
identical(d1, d2)
# [1] TRUE
于 2012-12-02T12:14:59.127 に答える