一种计算点的正交距离的快速方法,其中R = y = x

时间:2013-02-25 15:54:34

标签: r distance orthogonal

我有一堆点在y=x附近(参见下面的示例),我希望计算每个点的正交距离y=x。假设某个点的坐标为(a,b),则很容易看到y=x上的投影点具有坐标((a+b)/2, (a+b)/2)。我使用以下本机代码进行计算,但我认为我需要更快的而没有for循环。非常感谢你!

set.seed(999)
n=50
typ.ord = seq(-2,3, length=n)   # x-axis
#
good.ord = sort(c(rnorm(n/2, typ.ord[1:n/2]+1,0.1),rnorm(n/2,typ.ord[(n/2+1):n]-0.5,0.1)))
y.min = min(good.ord)
y.max = max(good.ord)
#
plot(typ.ord, good.ord, col="green", ylim=c(y.min, y.max))
abline(0,1, col="blue")
# 
# a = typ.ord
# b = good.ord
cal.orth.dist = function(n, typ.ord, good.ord){
  good.mid.pts = (typ.ord + good.ord)/2
  orth.dist = numeric(n)
  for (i in 1:n){
    num.mat = rbind(rep(good.mid.pts[i],2), c(typ.ord[i], good.ord[i]))
    orth.dist[i] = dist(num.mat)
  }
  return(orth.dist)
}
good.dist = cal.orth.dist(50, typ.ord, good.ord)
sum(good.dist)

2 个答案:

答案 0 :(得分:4)

一样简单

good.dist <- sqrt((good.ord - typ.ord)^2 / 2)

归结为计算点和线之间的距离。在y = x的2D情况下,这变得特别容易(自己尝试)。

答案 1 :(得分:4)

在更一般的情况下(扩展到可能超过2-D空间的其他行),您可以使用以下内容。它的工作原理是从要在其上投影点P的子空间(此处为向量A)构建projection matrix x。从点中减去投影分量会离开正交分量,为此可以很容易地计算距离。

x <- cbind(typ.ord, good.ord)          # Points to be projected
A <- c(1,1)                            # Subspace to project onto
P <- A %*% solve(t(A) %*% A) %*% t(A)  # Projection matrix P_A = A (A^T A)^-1 A^T
dists <- sqrt(rowSums(x - x %*% P)^2)  # Lengths of orthogonal residuals