2011-09-01 59 views
5

我有一大組我想要擬合橢球體的3D數據點。將橢球體擬合到3D數據點

我的數學很差,所以我無法在沒有任何數學庫的情況下實現最小二乘法。

有誰知道或有一段代碼可以適合橢圓體數據,我可以直接插入到我的項目中?在C將是最好的,但它應該沒有問題,我從C++,Java,C#,Python等轉換。

編輯:只是能夠找到中心將是一個巨大的幫助了。請注意,這些點不是均勻分佈的,因此取平均值不會導致中心。

+1

你希望你的點落在橢球體的表面上,或者你希望你的觀點是在一個橢圓形的雲? – ellisbben

+1

橢圓體可以旋轉嗎? – Prcela

+0

我期望它們落在橢球的表面上,所以中心是空心的。 – Hannesh

回答

1

Least Squares數據擬合可能是一種很好的方法,可以說明您描述的數據的性質。 GNU Scientific Library包含linearnon-linear最小二乘數據擬合例程。就你而言,你可能能夠將數據轉換爲線性空間並使用線性最小二乘法,但這取決於您的實際使用情況。否則,你需要使用非線性方法。

0

我有個主意。大致的解決方案,不是最好的,但會保持內點。在XY平面中找到將獲得所有點的半徑R1。 XZ平面(R2)和YZ平面(R3)也是如此。然後使用每個軸上的最大值。 A = max(R1,R2),B = max(R1,R3)和C = max(R2,R3)。 但是,首先找到所有點的平均值(中心)並將其與原點對齊。

+0

這就是我一直在做的事情。問題是它沒有找到橢球的實際最大值。另外,我希望所有點的平均數是中心!但是這隻有在點均勻分佈在表面上時纔有效。 – Hannesh

+0

嗯,這不是個好主意。 :)它比第一時間看起來更復雜。 – Prcela

2

如果你想要最小體積的橢圓體,請查看這個SO答案bounding ellipsoid

如果您想要最小二乘意義上的最佳擬合橢圓,請查看此代碼的error ellipsoids,您可在其中找到均值偏移3D點的協方差矩陣並使用該代碼構造橢球。

1

我找不到一個好的基於Java的橢球擬合算法,所以我最終自己寫了。對於具有2D點的橢圓有一些很好的算法,但對於具有3D點的橢球則沒有。我嘗試了幾個不同的MATLAB腳本,最終決定了Yury Petrov的Ellipsoid Fit。它適用於多項式Ax^2 + By^2 + Cz^2 + 2Dxy + 2Exz + 2Fyz + 2Gx + 2Hy + 2Iz = 1的橢球。它不使用任何約束來強制橢球,所以你必須有有相當多的點阻止隨機的quardic而不是橢球體。除此之外,它工作得很好。我使用Apache Commons Math編寫了一個小型Java庫,用Java實現了Yury Petrov的腳本。 GIT存儲庫位於https://github.com/BokiSoft/EllipsoidFit

0

0

我前段時間移植尤里·彼得羅夫的最小二乘Matlab的鉗工到Java,它只需要JAMA:https://github.com/mdoube/BoneJ/blob/master/src/org/doube/geometry/FitEllipsoid.java

+0

你應該喜歡原始的Matlab源代碼以及包含JAMA的鏈接/解釋,因爲問題表明Java代碼必須可移植到C. –

+0

當然:Matlab源代碼http://www.mathworks.com/matlabcentral/fileexchange/24693-ellipsoid-fit – mdoube

+0

JAMA是一個Java矩陣庫 - C/C++必須存在類似的庫http://math.nist.gov/javanumerics/jama/ – mdoube

1

我們制定了一套Matlab和Java的代碼在這裏適應橢球: https://github.com/pierre-weiss

您還可以查看我們的開源Icy插件。以下教程可能會對您有所幫助: https://www.youtube.com/endscreen?video_referrer=watch&v=nXnPOG_YCxw

注意:大多數現有代碼都符合通用二次方程式,並且不會強加橢球體形狀。爲了獲得更多的魯棒性,你需要進行凸面編程而不僅僅是線性代數。這是在指出的來源中所做的。

乾杯, 皮埃爾