2013-08-16 21 views
5

Mam ten zestaw współrzędnych x i y:Jak uzyskać długości półosie elipsy? w R

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 

i chcę obliczyć elipsoidy, który zawiera zbiór punktów, używam funkcji ellipsoidhull() w pakiecie „klastra”, a ja się :

> 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 

jednak to nie jest dla mnie oczywiste, w jaki sposób można dostać się z tych wyników, długości pół-głównych osi tej elipsy.

Każdy pomysł?

Dziękuję bardzo z góry.

Tina.

+1

Może warto czytania thru to pytanie http://stackoverflow.com/questions/3417028/ellipse-around-the-data-in-matlab i linki tam przez jakiś informacji na temat dotycząca wartości własne kowariancji macierz do osi elipsy. –

+0

user18441 Traktuję pytanie jako problem geometryczny, więc może warto przeczytać link pokazany w powyższym komentarzu i użyć lepszych narzędzi (narzędzi statystycznych), aby sobie z nim poradzić. – agstudy

+1

Jeszcze lepiej, strona wikipedii "elipsoida" definiuje macierz kształtu w kategoriach osi (przez wartości własne), więc powinieneś być w stanie wyraźnie obliczyć promienie. –

Odpowiedz

4

Kwadrat półosi stanowią wartości własne kształtu macierzy kształtu, razy średni kwadrat do promienia.

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)) 
+0

Dziękuję Vincent. Przepraszam moją ignorancję."a" i "b" długości osi elipsy, a zatem aby uzyskać półosi, które trzeba podzielić przez 2. Czy to prawda? – user18441

+0

Tak, ukradnij moje commments-odpowiedź :-). Bardzo ładne szczegóły w tym kodzie. –

+0

@ user18441: komentarze w moim kodzie były niepoprawne, są to już półosi - nie ma potrzeby dzielenia przez 2. –

4

Można to zrobić:

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

Następnie należy obliczyć minimalna i maksymalna odległość, aby odpowiednio mniejszą i główną oś:

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

EDIT działkę elipsy z osi:

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),]) 

enter image description here

+0

Dziękuję agstudy! żeby je spisać, myślę, że muszę wyśledzić linię między środkiem elipsy a punktem najbardziej oddalonym i najbliższym. Masz pomysł, jak można to łatwo zrobić? – user18441

+0

@ user18441 yes. możesz zobaczyć moją edycję. – agstudy

+0

dziękuję bardzo! – user18441

Powiązane problemy