我已经创建了这个小代码并且总结了循环结果的麻烦。有人可以帮我吗?
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个数字,但只能显示最后一个
答案 0 :(得分: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
。
答案 1 :(得分: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
答案 2 :(得分: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