2011-09-01 11 views
5

Tengo un gran conjunto de puntos de datos 3D a los que quiero ajustar a un elipsoide.Colocación de un elipsoide en puntos de datos 3D

Mis matemáticas son bastante malas, así que estoy teniendo problemas para implementar el método de mínimos cuadrados sin ninguna biblioteca matemática.

¿Alguien sabe o tiene un fragmento de código que puede encajar en un elipsoide a datos que puedo conectar directamente a mi proyecto? En C sería mejor, pero no debería ser un problema para mí convertir de C++, Java, C#, python, etc.

EDITAR: Solo poder encontrar el centro sería de gran ayuda. Tenga en cuenta que los puntos no están espaciados de manera uniforme, por lo que tomar la media no resultará en el centro.

+1

¿Espera que sus puntos de caer sobre la superficie del elipsoide o espera sus puntos para estar en una nube elipsoidal? – ellisbben

+1

¿Se puede rotar el elipsoide? – Prcela

+0

Espero que caigan en la superficie de un elipsoide, por lo que el centro es hueco. – Hannesh

Respuesta

1

Least Squares La adaptación de datos es probablemente una buena metodología que da la naturaleza de los datos que usted describe. El GNU Scientific Library contiene linear y non-linear rutinas de ajuste de datos de mínimos cuadrados. En su caso, puede transformar sus datos en un espacio lineal y usar mínimos cuadrados lineales, pero eso dependería de su caso de uso real. De lo contrario, necesitarás usar métodos no lineales.

0

Tengo una idea. Solución aproximada, no es la mejor, pero mantendrá los puntos dentro. En el plano XY, encuentre el radio R1 que obtendrá todos los puntos. Lo mismo ocurre con el plano XZ (R2) y el plano YZ (R3). Luego usa los máximos en cada eje. A = max (R1, R2), B = max (R1, R3) y C = max (R2, R3). Pero, antes que nada, encuentre el promedio (centro) de todos los puntos y alinéelo al origen.

+0

Eso es lo que he estado haciendo hasta ahora. El problema es que no encuentra el máximo real del elipsoide. Además, ¡desearía que el promedio de todos los puntos fuera el centro! Pero eso solo funciona si los puntos están distribuidos uniformemente en la superficie. – Hannesh

+0

Bueno, no es tan buena idea. :) es más complejo de lo que parece en el primer momento. – Prcela

2

Si desea el elipsoide delimitador de volumen mínimo, consulte esta respuesta SO para un bounding ellipsoid.

Si desea la elipse de mejor ajuste en un sentido de mínimos cuadrados, consulte este código de MATLAB para error ellipsoids donde encontrará la matriz de covarianza de sus puntos tridimensionales con desplazamiento medio y la usará para construir el elipsoide.

6

Aquí van:

Este documento describe el montaje de un elipsoide de múltiples dimensiones, así como encontrar el centro de la ellipois. Espero que esto ayude,

http://www.physics.smu.edu/~scalise/SMUpreprints/SMU-HEP-10-14.pdf

(por cierto, estoy suponiendo que esta respuesta es un poco tarde, pero pensé que me gustaría añadir esta solución para cualquier persona que se topa con su pregunta en busca de lo mismo :)

1

No pude encontrar un buen algoritmo basado en Java para ajustar un elipsoide, así que terminé escribiéndolo yo mismo. Hubo algunos buenos algoritmos para una elipse con puntos 2D, pero no para un elipsoide con puntos 3D. Experimenté con algunos scripts de MATLAB diferentes y eventualmente me conformé con el Elipsoide Fit de Yury Petrov. Encaja un elipsoide al polinomio Ax^2 + By^2 + Cz^2 + 2Dxy + 2Exz + 2Fyz + 2Gx + 2Hy + 2Iz = 1. No usa ninguna restricción para forzar un elipsoide, por lo que debes tener una cantidad bastante grande de puntos para evitar que un quardic al azar se ajuste en lugar del elipsoide. Aparte de eso, funciona realmente bien. Escribí una pequeña biblioteca de Java usando Apache Commons Math que implementa el script de Yury Petrov en Java. El repositorio de GIT se puede encontrar en https://github.com/BokiSoft/EllipsoidFit.

0

0

me portado por mínimos cuadrados de Yury Petrov Matlab más en forma a Java hace algún tiempo, sólo necesita JAMA: https://github.com/mdoube/BoneJ/blob/master/src/org/doube/geometry/FitEllipsoid.java

+0

Le gustaría tener la fuente original de Matlab, así como incluir enlaces/explicaciones para JAMA, ya que la pregunta establece que el código de Java debe ser portable a C. –

+0

Seguro: fuente de Matlab http://www.mathworks.com/matlabcentral/fileexchange/24693-elipsoid-fit – mdoube

+0

JAMA es una biblioteca matricial de Java. Deben existir bibliotecas similares para C/C++ http://math.nist.gov/javanumerics/jama/ – mdoube

1

Hemos desarrollado un conjunto de códigos de Matlab y Java para adaptarse a elipsoides aquí: https://github.com/pierre-weiss

También puede consultar nuestro plugin Icy de fuente abierta. El siguiente tutorial puede ser útil: https://www.youtube.com/endscreen?video_referrer=watch&v=nXnPOG_YCxw

Nota: la mayoría de los códigos existentes se ajustan a un quadric genérico y no imponen una forma elipsoidal. Para obtener más robustez, necesita ir a la programación convexa en lugar de solo álgebra lineal. Esto es lo que se hace en las fuentes indicadas.

Saludos, Pierre

Cuestiones relacionadas