J'ai un grand ensemble de points de données 3D auxquels je veux vous adapter à un ellipsoïde. p>
Mes mathématiques sont assez pauvres, je n'ai donc pas de difficulté à mettre en œuvre la méthode des moindres carrés sans aucune bibliothèque de mathématiques. P>
Est-ce que quelqu'un connaît-il ou a un morceau de code pouvant adapter une ellipsoïde à des données que je peux brancher directement dans mon projet? En C serait préférable, mais cela ne devrait pas être un problème pour moi de convertir de C ++, Java, C #, Python, etc. P>
EDIT: Juste être capable de trouver le centre serait une aide énorme aussi. Notez que les points ne sont pas uniformément espacés de sorte que la moyenne n'entraîne pas le centre. P>
9 Réponses :
J'ai une idée. Environ une solution, pas la meilleure mais gardera des points à l'intérieur. Dans l'avion XY, trouvez le rayon R1 qui obtiendra tous les points. Même pour le plan XZ (R2) et YZ (R3). Utilisez ensuite les maximums sur chaque axes. A = max (R1, R2), B = max (R1, R3) et C = max (R2, R3). Mais, tout d'abord, trouvez la moyenne (centre) de tous les points et l'alignent à l'origine. P>
C'est ce que j'ai fait jusqu'à maintenant. Le problème est qu'il ne trouve pas le maximum réel de l'ellipsoïde. En outre, je souhaite que la moyenne de tous les points était le centre! Mais cela ne fonctionne que si les points sont répartis de manière uniforme à la surface.
Eh bien, ce n'est pas une si bonne idée. :) C'est plus complexe qu'il n'y paraît au premier instant.
Les moindres carrés Le raccord de données est probablement une bonne méthodologie donner la nature des données que vous décrivez. Le bibliothèque scientifique GNU contient linéaire et routines de raccord de données non linéaires moindres carrés. Dans votre cas, vous pourrez peut-être transformer vos données en espace linéaire et utiliser les moindres carrés linéaires, mais cela dépend de votre cas d'utilisation réelle. Sinon, vous devrez utiliser des méthodes non linéaires. P>
Si vous voulez que le volume minimum entourant ellipsoïde, consultez ce type de réponse pour un bornshipsoid a>. p>
Si vous voulez la meilleure ellipse d'ajustement dans un sens des moindres carrés, consultez ce code MATLAB pour Erreur ellipsoïdes où vous trouvez la matrice de covariance de vos points 3D méchants et utilisez-le pour construire l'ellipsoïde. P>
Vous allez ici: p>
Ce document décrit le montage d'une ellipsoïde à plusieurs dimensions, ainsi que de trouver le centre de l'ellipois. J'espère que cela aide, p>
http://www.physics.smu.edu/~calise /Smupreprintts/smu-hep-10-14.pdf p>
(BTW, je suppose que cette réponse est un peu tardif, mais je pensais que j'ajouterais cette solution à quiconque trébuche sur votre question à la recherche de la même chose :) p>
Je n'ai pas pu trouver un bon algorithme basé sur Java pour avoir installé un ellipsoïde, alors j'ai fini par écrire moi-même. Il y avait de bons algorithmes pour une ellipse avec des points 2D, mais pas pour un ellipsoïde avec des points 3D. J'ai expérimenté quelques scripts de Matlab et éventuellement réglé sur l'ajustement ellipsoïde de Yury Petrov. Il convient à un ellipsoïde sur la hache polynomiale ^ 2 + par ^ 2 + cz ^ 2 + 2DXY + 2EXZ + 2FYZ + 2GX + 2GX + 2HY + 2Z = 1. Il n'utilise aucune contrainte pour forcer une ellipsoïde, de sorte que vous devez donc avoir un nombre assez grand de points pour empêcher une quardique aléatoire d'être en forme au lieu de l'ellipsoïde. Outre cela, cela fonctionne vraiment bien. J'ai écrit une petite bibliothèque Java en utilisant Apache Commons Math qui implémente le script de Yury Petrov en Java. Le référentiel git peut être trouvé sur https://github.com/bokisoft/ellipsoidfit . p>
p>
Je viens de passer par le même processus. Voici un module Python basé sur le travail de Nima Moshtagh. Référencé dans de nombreux endroits mais aussi dans cette question sur un Ellipse P>
Ce module gère également le tracé de l'ellipsoïde final. Profiter! P>
https://github.com/minillinim/ellipsoid/blob/master /ellipipsoid.py p>
J'ai porté le moindre carré de Yuro Petrov Matlab Ensemble de Java il y a quelque temps, il n'a besoin que de Jama: https://github.com/mdoube/bonej/blob/master/src/org/doube/getométrie/fitellipsoid.java P>
Vous aimerez la source d'origine MATLAB, ainsi que les liens / explications de JAMA, car la question indique que le code Java doit être portable à C.
Bien sûr: Matlab Source mathworks.com/matlabentral/fileeXChange/24693-ellipipsoid-fit < / a>
Jama est une bibliothèque matricielle Java - des bibliothèques similaires doivent exister pour C / C ++ math.nist.gov/javanumerics/ Jama
Nous avons développé un ensemble de codes Matlab et Java pour adapter les ellipsoïdes ici: https://github.com/pierre-weiss p>
Vous pouvez également consulter notre plugin glacé à source open source. Le tutoriel suivant peut être utile: https://www.youtube.com/endscreen?video_referrer=watch&v=nxnpog_ycxw p>
Remarque: la plupart des codes existants correspondent à un quadrique générique et n'imposent pas de forme ellipsoïdale. Pour obtenir plus de robustesse, vous devez aller à la programmation convexe plutôt que de l'algèbre linéaire. C'est ce qui est fait dans les sources indiquées. P>
acclamations, Pierre p>
Voici une méthode très simple pour trouver des foyers, en fonction de la recherche aléatoire. Aucune algèbre linéaire utilisée. Donc, si vous allez bien avec une solution non parfaite:
3DPoints - Array of some Amount of points vecCenter - average of 3DPoints AngleCosine - cos of angle between two vectors RandomOrder(3DPoints) vecFocus := (0, 0, 0) for i := 0 to Amount: vecRadius := 3DPoints[i] - vecCenter // Change vecRadius direction to parallel if AngleCosine(vecFocus, vecRadius) < 0 then vecRadius *= -1 vecFocus += (vecRadius - vecFocus) / Amount
Vous attendez-vous à ce que vos points tombent à la surface de l'ellipsoïde ou attendez-vous que vos points sont dans un nuage ellipsoïdal?
Je m'attends à ce qu'ils tombent à la surface d'un ellipsoïde, le centre est donc creux.