我有两个坐标和长度不同的数据框,我试图计算从第一个日期帧的每个点(例如2个点)到第二个数据帧的每个点(例如4个点)的欧几里德距离:
结果:
point[1] dist1, dist2, dist3, dist4
point[2] dist1, dist2, dist3, dist4
这是我的剧本:
i=1
for (i in dim(coordinates)[1]) {
result[i]<-
sqrt((coordinates[i,1] - reference[,1])^2 +
(coordinates[i,2] - reference[,2])^2 +
(coordinates[i,3] - reference[,3])^2)
}
但它只返回距离最后一点的距离(点[2]) 我怎样才能修复脚本?任何帮助都会很棒
提前致谢
答案 0 :(得分:1)
我一直都犯这个错误。 dim 返回一个数字,因此您需要从 1 到 dim 循环 i 。
我更改了第二行以循环执行序列1:dim(coordinates)[1]。
i=1
for (i in 1:dim(coordinates)[1]) {
result<-
sqrt((coordinates[i,1] - reference[,1])^2 +
(coordinates[i,2] - reference[,2])^2 +
(coordinates[i,3] - reference[,3])^2)
}
现在您只需要确保结果向量有两个插槽。如果它不起作用,请将其放在开头。
result <- rep(NA, 1:dim(coordinates)[1])
答案 1 :(得分:0)
可以利用矩阵代数并计算没有循环的距离。
对于两个矩阵A,B,其中行表示实例,列表示坐标(即,在3维中,两个矩阵都有3列),平方距离矩阵可以计算为
d ^ 2(A,B)= || A-B || ^ 2 = A ^ 2 + B ^ 2 - 2 * A * B
这可以转换为R,例如,如下:
d <- sqrt( matrix(diag(A %*% t(A)), nrow=dim(A)[1], ncol=dim(B)[1])
+ t(matrix(diag(B %*% t(B)), nrow=dim(B)[1], ncol=dim(A)[1]))
- 2*A %*% t(B) )
结果距离矩阵在A中为每个实例都有一行,在B中为每个实例都有一列。