【问题标题】:How to obtain the lengths of semi axes of an ellipse? in R如何获得椭圆的半轴长度?在 R 中
【发布时间】:2013-08-19 03:49:16
【问题描述】:

我有这组 x 和 y 坐标:

x<-c(1.798805,2.402390,2.000000,3.000000,1.000000)
y<-c(0.3130147,0.4739707,0.2000000,0.8000000,0.1000000)
as.matrix(cbind(x,y))->d

我想计算包含这组点的椭球,我使用包“cluster”中的函数ellipsoidhull(),我得到:

> ellipsoidhull(d)
'ellipsoid' in 2 dimensions:`
 center = ( 2.00108 0.36696 ); squared ave.radius d^2 =  2`
and shape matrix =
x 0.66590 0.233106
y 0.23311 0.095482
  hence, area  =  0.60406

但是我不清楚如何从这些结果中得到这个椭圆的半长轴的长度。

有什么想法吗?

非常感谢您。

蒂娜。

【问题讨论】:

  • 可能值得阅读这个问题stackoverflow.com/questions/3417028/… 以及那里的链接,以获取有关将协方差矩阵的特征值与椭圆轴相关联的一些信息。
  • user18441 我把这个问题当作一个几何问题,所以也许值得你阅读上面评论中显示的链接并使用更好的工具(统计工具)来处理它。
  • 更好的是,维基百科页面“椭圆体”根据轴(通过特征值)定义形状矩阵,因此您应该能够明确计算半径。

标签: r geometry ellipse


【解决方案1】:

你可以这样做:

exy <- predict(ellipsoidhull(d)) ## the ellipsoid boundary
me <- colMeans((exy))            ## center of the ellipse

然后你计算最小和最大距离分别得到短轴和长轴:

dist2center <- sqrt(rowSums((t(t(exy)-me))^2))
max(dist2center)     ## major axis
[1] 1.264351
> min(dist2center)   ## minor axis
[1] 0.1537401

EDIT用轴绘制椭圆:

plot(exy,type='l',asp=1)
points(d,col='blue')
points(me,col='red')
lines(rbind(me,exy[dist2center == min(dist2center),]))
lines(exy[dist2center == max(dist2center),])

【讨论】:

  • 谢谢agstudy!要绘制它们,我想我需要在椭圆的中心和最远和离它最近的点之间画一条线。知道如何轻松做到这一点吗?
  • 嘿。完全无几何形状的解决方案。 me &lt;- colMeans((exy)) 可能是一个更好的中心吗?我认为样本中的内部点不应该有贡献。
  • @DWin 对。我编辑我的答案。但是,由于某些原因,我最高得到 2 分,但最低只有 1 分。
  • 也许你需要同时查看 min 和 "next-min" ,即如果有这样的词,倒数第二个最小值?
  • 最后一件事,使用现在的代码,我似乎没有很好地绘制半轴。长半轴似乎占据了长轴的总长度,而短轴未能与长轴成 90º。有什么问题?
【解决方案2】:

半轴的平方是 形状矩阵的特征值,乘以平均平方半径。

x <- c(1.798805,2.402390,2.000000,3.000000,1.000000)
y <- c(0.3130147,0.4739707,0.2000000,0.8000000,0.1000000)
d <- cbind( x, y )
library(cluster)
r <- ellipsoidhull(d)
plot( x, y, asp=1, xlim=c(0,4) )
lines( predict(r) )
e <- sqrt(eigen(r$cov)$values)
a <- sqrt(r$d2) * e[1]  # semi-major axis
b <- sqrt(r$d2) * e[2]  # semi-minor axis
theta <- seq(0, 2*pi, length=200)
lines( r$loc[1] + a * cos(theta), r$loc[2] + a * sin(theta) )
lines( r$loc[1] + b * cos(theta), r$loc[2] + b * sin(theta) )

【讨论】:

  • 谢谢文森特。对不起我的无知。 “a”和“b”是椭圆轴的长度,因此要得到半轴,它们需要除以 2。这是正确的吗?
  • 是的,是的,偷我的评论-答案:-)。这段代码中的细节非常好。
  • @user18441:我的代码中的 cmets 不正确,它们已经是半轴——不需要除以 2。
  • 非常感谢文森特!
  • 屏幕截图会很好。在我意识到这是一个不同的答案之前,我花了 2-3 分钟试图看看它与下面的情节是如何对应的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多