2011-09-01 3 views
5

Possiedo un ampio set di punti dati 3D a cui voglio adattarsi a un ellissoide.Inserimento di un ellissoide in punti dati 3D

La mia matematica è piuttosto scarsa, quindi ho difficoltà ad implementare il metodo dei minimi quadrati senza alcuna libreria matematica.

Qualcuno conosce o dispone di un codice che può contenere un ellissoide per i dati che posso collegare direttamente al mio progetto? In C sarebbe meglio, ma per me non dovrebbe esserci un problema di conversione da C++, Java, C#, python, ecc.

EDIT: Essere in grado di trovare il centro sarebbe di grande aiuto. Si noti che i punti non sono equidistanti, quindi prendere la media non risulterà nel centro.

+1

Ti aspetti i tuoi punti a cadere sulla superficie dell'ellissoide o vi aspettate i vostri punti di essere in una nube ellissoidale? – ellisbben

+1

È possibile ruotare l'ellissoide? – Prcela

+0

Mi aspetto che cadano sulla superficie di un ellissoide, quindi il centro è vuoto. – Hannesh

risposta

1

Least Squares l'adattamento dei dati è probabilmente una buona metodologia che fornisce la natura dei dati che descrivi. Lo GNU Scientific Library contiene linear e non-linear routine di adattamento dei dati dei minimi quadrati. Nel tuo caso, potresti essere in grado di trasformare i tuoi dati in uno spazio lineare e utilizzare minimi quadrati lineari, ma ciò dipenderebbe dal tuo caso d'uso reale. Altrimenti, dovrai utilizzare metodi non lineari.

0

Ho un'idea. Approssimativamente la soluzione, non la migliore ma manterrà punti all'interno. Nel piano XY trova il raggio R1 che otterrà tutti i punti. Lo stesso vale per il piano XZ (R2) e il piano YZ (R3). Quindi utilizzare i massimi su ciascun asse. A = max (R1, R2), B = max (R1, R3) e C = max (R2, R3). Ma, prima di tutto, trova la media (al centro) di tutti i punti e allinearla all'origine.

+0

Questo è quello che ho fatto fino ad ora. Il problema è che non trova il massimo effettivo dell'ellissoide. Inoltre, vorrei che la media di tutti i punti fosse il centro! Ma funziona solo se i punti sono distribuiti uniformemente sulla superficie. – Hannesh

+0

Beh, non è una buona idea. :) è più complesso di quanto non sembri al primo momento. – Prcela

2

Se si desidera l'ellissoide che racchiude il volume minimo, controllare questa risposta SO per bounding ellipsoid.

Se si desidera l'ellisse di raccordo migliore in un senso di minimi quadrati, controllare questo codice MATLAB per error ellipsoids dove si trova la matrice di covarianza dei punti 3D a viraggio medio e utilizzare tale per costruire l'ellissoide.

6

qui si va:

Questo articolo descrive il montaggio di un ellissoide di molteplici dimensioni oltre a trovare il centro per l'ellipois. Spero che questo aiuti,

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

(btw, sto assumendo questa risposta è un po 'in ritardo, ma ho pensato che vorrei aggiungere questa soluzione per chi si imbatte in tua domanda alla ricerca per la stessa cosa :)

1

Non sono riuscito a trovare un buon algoritmo basato su Java per il montaggio di un ellissoide, quindi ho finito per scriverlo da solo. C'erano alcuni buoni algoritmi per un'ellisse con punti 2D, ma non per un ellissoide con punti 3D. Ho fatto esperimenti con alcuni script MATLAB diversi e alla fine ho optato per l'Ellipsoid Fit di Yury Petrov. Si adatta ad un ellissoide al polinomio Ax^2 + By^2 + Cz^2 + 2Dxy + 2Exz + 2Fyz + 2Gx + 2Hy + 2Iz = 1. Non usa alcun vincolo per forzare un ellissoide, quindi devi avere un numero piuttosto elevato di punti per impedire che un quardico casuale si adatti al posto dell'ellissoide. Oltre a questo, funziona davvero bene. Ho scritto una piccola libreria Java usando Apache Commons Math che implementa lo script di Yury Petrov in Java. Il repository GIT può essere trovato a https://github.com/BokiSoft/EllipsoidFit.

0

0

ho portato ai minimi quadrati di Yury Petrov Matlab montatore a Java qualche tempo fa, ha solo bisogno JAMA: https://github.com/mdoube/BoneJ/blob/master/src/org/doube/geometry/FitEllipsoid.java

+0

Ti piacerebbe avere il sorgente originale Matlab così come includere link/spiegazioni per JAMA, dal momento che la domanda afferma che il codice Java deve essere trasferibile a C. –

+0

Sicuro: fonte Matlab http://www.mathworks.com/matlabcentral/fileexchange/24693-ellipsoid-fit – mdoube

+0

JAMA è una libreria a matrice Java - librerie simili devono esistere per C/C++ http://math.nist.gov/javanumerics/jama/ – mdoube

1

Abbiamo sviluppato una serie di codici di MATLAB e Java per adattarsi ellissoidi qui: https://github.com/pierre-weiss

Puoi anche controllare il nostro plugin Icy open-source. Il seguente tutorial può essere utile: https://www.youtube.com/endscreen?video_referrer=watch&v=nXnPOG_YCxw

Nota: la maggior parte dei codici esistenti si adattano a un quadrico generico e non impongono una forma ellissoidale. Per ottenere maggiore robustezza, è necessario andare a convocare la programmazione piuttosto che l'algebra lineare. Questo è ciò che viene fatto nelle fonti indicate.

Cheers, Pierre