1

私はこの小さなコードを作成しましたが、ループの結果を要約するのに問題があります。誰かが私を助けることができますか?

a = array(c(1,1,1,1,1,1,1,2,1,1,1,1,1), dim=c(4,3))
b = array(c(0,0,0,0,0,1), dim=c(2,3))

dist <- array()
for (j in 1:2) { 
  for (i in 1:4) {
  dist <- sqrt (sum ((a[i, ]-b[j, ])^2))
  print(dist)
  }
}

結果として8つの数字が表示されますが、最後の数字しか表示できません

4

3 に答える 3

4

または、この関数を使用することもできますouter(匿名関数をベクトル化するためのより良い方法を誰かが思いついた場合は、自由に編集してください)

(dist <- outer(1:4, 1:2, FUN = Vectorize(function(x,y)sqrt(sum((a[x,]-b[y,])^2)))))
         [,1]     [,2]
[1,] 1.732051 1.414214
[2,] 1.732051 1.414214
[3,] 1.732051 1.414214
[4,] 2.449490 2.236068

1:4インデックス付けaに使用され、インデックス作成に1:2使用されますb

于 2012-08-16T14:43:33.200 に答える
3

distあなたが行くようにあなたのマトリックスを記入する必要があります。

dist <- array(dim=c(4,2))
for (j in 1:2) {
  for (i in 1:4) {
    dist[i,j] <- sqrt (sum ((a[i,1:3]-b[j,1:3])^2))
  } 
}
dist
于 2012-08-16T14:34:28.640 に答える
2

組み込みdist関数を使用して、これらすべてのネストされたforループを回避することもできます

distユークリッド距離を計算します(可能性の数からのデフォルト)。これはあなたが望むもののようです。

詳細については、を参照?distしてください

# give a and b some rownames

row.names(a)  <- paste0('a',1:nrow(a))
row.names(b)  <- paste0('b',1:nrow(b))
#combine into one matrix
ab <- rbind(a,b)

# get the distance between the points

distances <- as.matrix(dist(ab))

# subset those you are interested in
distances[row.names(a),row.names(b)]

##           b1       b2
## a1 1.732051 1.414214
## a2 1.732051 1.414214
## a3 1.732051 1.414214
## a4 2.449490 2.236068
于 2012-08-17T03:41:59.137 に答える