dist関数

今までせこせこユークリッド距離行列を求めるコードを書いていたのだけど、distなんていう距離行列を求めてくれる関数があるのね。

行方向にデータが、列方向にデータの次元が格納されているdataとうい行列があったとして、データ点数がNUMであるときにユークリッド距離行列distmatを作成したいとすると、

Before

for (i in 1:NUM) {
  for (j in i:NUM) {
    distmat[i,j] <- sqrt(sum((data[i,] - data[j,])^2))
  }
  for (i in 1:NUM) {
    for (j in 1:NUM) {
      distmat[j,i] <- distmat[i,j]
    }
  }
}

After

distmat <- dist(data, method="euclidean", diag=T, upper=T)

という訳で

あらすっきり。
行方向にデータを持ってきたのは、実はdist()の仕様のためです。

組み込み関数なのでじまえでforをぐるぐる回すという最低な俺のコードに比べて速度も多分格段に早くなっている。
オプションでユークリッド距離以外にも最大距離とかマンハッタン距離とかも選べるらしい。
ノルムも任意のノルムが選択できるっぽいので、なかなか優秀ですね。