3

私は周りに点がたくさんあります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)
4

2 に答える 2

4

と同じくらい簡単

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

要するに、点と線の間の距離を計算することです。の 2D の場合y = x、これは特に簡単になります (自分で試してみてください)。

于 2013-02-25T16:15:27.473 に答える
4

より一般的なケース (おそらく 2 次元以上の空間で他の行に拡張する) では、次のように使用できます。ポイントを投影する部分空間 (ここではベクトル)から射影行列 を構築することによって機能します。ポイントから投影されたコンポーネントを差し引くと、距離を簡単に計算できる直交コンポーネントが残ります。PAx

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
于 2013-02-25T17:02:02.230 に答える