2012-06-05 14 views
6

मैं ~ 6-10k 3 डी पॉइंट्स के सेट पर एक विमान फिट करने के लिए देख रहा हूं। मैं जितनी जल्दी हो सके इसे करने की कोशिश कर रहा हूं, और सटीकता सबसे ज्यादा चिंता नहीं है (स्पष्ट रूप से विमान किसी भी कार्डिनल अक्ष में + -10 डिग्री से बंद हो सकता है)।कई बिंदुओं के लिए फास्ट प्लेन फिटिंग

मेरा वर्तमान दृष्टिकोण सबसे अच्छा फिट का उपयोग करना है, लेकिन यह अविश्वसनीय रूप से धीमा है (मैं एल्गोरिदम चलाने पर हर बार लगभग 10-50k बार की दर से विमान निकालने की उम्मीद कर रहा हूं, और इस दर पर यह खत्म हो जाएगा हफ्तों में, घंटों के विपरीत) क्योंकि यह 6000 अंक के सभी संभावित संयोजनों पर काम करता है, इसलिए ~ 35,000,000,000 पुनरावृत्तियों, और स्पष्ट रूप से इसकी आवश्यकता से मुझे बहुत अधिक सटीकता है।

क्या कोई भी कमजोर विमान-फिटिंग तकनीकों के बारे में जानता है जो मेरे एल्गोरिदम को काफी तेज़ी से बढ़ा सकते हैं?

संपादित करें:

मैं हर संभव 3 डी कोण पर विमानों बनाकर ~ 42k के लिए नीचे पुनरावृत्तियों की संख्या पाने में कामयाब रहे है (5 डिग्री प्रत्येक समय के माध्यम से कदम) और खोजने के लिए इन के खिलाफ मौजूदा अंक का परीक्षण मेरे पास बिंदुओं के लिए विमानों को फिट करने के बजाय सबसे अच्छा विमान है।

मुझे यकीन है कि विभाजित और जीतने से यहां कुछ हासिल किया जा सकता है, हालांकि मुझे चिंता है कि मैं सीधे सबसे अच्छे विमान से कूद सकता हूं।

+0

आप के लिए [कर्व फिटिंग उपकरण बॉक्स] (http पहुँच है। com/मदद/टूलबॉक्स/curvefit/brviv3f-1.html # bs1cj4_ -1)? – kevlar1818

+0

दुर्भाग्यवश मैं नहीं करता, मैं वेनिला MATLAB के साथ फंस गया हूं, हालांकि मेरे पास सामान्य रूप से बहुत सारे प्रोग्रामिंग अनुभव हैं इसलिए मुझे काफी जटिल एल्गोरिदम को संभालने में सक्षम होना चाहिए। –

+4

यदि सटीकता आपकी मुख्य चिंता नहीं है, तो अपने डेटा की इनपुट जटिलता को कम करने का प्रयास करें। 6-10k अंक के प्रारंभिक सेट पर केमैन या कुछ चलाएं, और उसके बाद विमान को उदाहरण के लिए फिट करें। – Ansari

उत्तर

13

का प्रयोग करें, और एक आव्यूह गुणन के रूप में समीकरण लिखें:

griddata से उदाहरण लें। P है अपने अज्ञात 4x1 [A;B;C;D]

g = [x y z 1]; % represent a point as an augmented row vector 
g*P = 0;  % this point is on the plane 

अब आपके सभी वास्तविक अंक, एक Nx4 मैट्रिक्स G को यह का विस्तार करें। नतीजा अब बिल्कुल 0 नहीं है, यह वह त्रुटि है जिसे आप कम करने की कोशिश कर रहे हैं।

G*P = E; % E is a Nx1 vector 

तो क्या आप चाहते हैं जी के अशक्त अंतरिक्ष, SVD से पाया जा सकता है के लिए निकटतम वेक्टर है। आइए परीक्षण करें:

% Generate some test data 
A = 2; 
B = 3; 
C = 2.5; 
D = -1; 

G = 10*rand(100, 2); % x and y test points 
% compute z from plane, add noise (zero-mean!) 
G(:,3) = -(A*G(:,1) + B*G(:,2) + D)/C + 0.1*randn(100,1); 

G(:,4) = ones(100,1); % augment your matrix 

[u s v] = svd(G, 0); 
P = v(:,4);    % Last column is your plane equation 

ठीक है, याद रखें कि पी स्केलर द्वारा भिन्न हो सकता है। तो बस पता चलता है कि हम से मेल खाते हैं:

scalar = 2*P./P(1); 
P./scalar 

ans = 2,0000 3,0038 2,5037 -0,9997

1

ऐसा लगता है कि griddata आप जो चाहते हैं हो सकता है। लिंक में इसका एक उदाहरण है।

यदि यह काम नहीं करता है, तो MATLAB फ़ाइल एक्सचेंज पर gridfit देखें। यह griddata से अधिक सामान्य मामले से मेल खाता है।

शायद आप अपनी खुद की सतह फिटिंग रोलिंग नहीं करना चाहते हैं, क्योंकि वहाँ कई अच्छी तरह से प्रलेखित उपकरण हैं। मानक विमान समीकरण Ax + By + Cz + D = 0

x = % some values 
y = % some values 
z = % function values to fit to 

ti = % this range should probably be greater than or equal to your x,y test values 
[xq,yq] = meshgrid(ti,ti); 
zq = griddata(x,y,z,xq,yq,'linear'); % NOTE: linear will fit to a plane! 
Plot the gridded data along with the scattered data. 

mesh(xq,yq,zq), hold 
plot3(x,y,z,'o'), hold off 
+1

बहुत बहुत धन्यवाद, मैं इसे तुरंत देख लूंगा। मैं आमतौर पर सीएस पृष्ठभूमि से अधिक हूं, इसलिए मेरी सतह-फिटिंग गणित थोड़ा पीछे है। इस तरह मैं किसी और के कोड को नौकरी करने के लिए खुश हूं –

+0

हम्म griddata के साथ मेरी समस्या यह है कि इसे मुझे एक विमान प्रदान करने के लिए, मुझे (उनके पहले उदाहरण के आधार पर) को यह कहना है 4 अंक (-1, -1), (-1,1), (1, -1), (1,1) (2: -2 का उपयोग करके - उदाहरण में सेट डेटा की सीमाओं का उपयोग करके zq उत्पन्न करें - किसी कारण से केवल NaN लौटाता है)। दुर्भाग्यवश यह गारंटी देता है कि विमान के कोनों (-1, -1), (-1,1), (1, -1), (1,1) पर होंगे और ऐसा लगता है कि ऐसा नहीं लगता है विचार में कोई और अंक। यदि मैं अंक की संख्या में वृद्धि करता हूं, तो मुझे अब विमान नहीं मिलता है। –

+0

@NickUdell कुछ कोड डालें जो आपने अपने उत्तर में किया है ताकि मैं आपकी और अधिक मदद कर सकूं। – kevlar1818

0

आप जॉन डी 'Errico द्वारा consolidator कोशिश कर सकते हैं। यह किसी दिए गए सहिष्णुता के भीतर बिंदुओं को जोड़ता है, इससे डेटा की मात्रा को कम करने और गति में वृद्धि करने की अनुमति मिल जाएगी।आप जॉन के gridfit फ़ंक्शन को भी देख सकते हैं जो आमतौर पर griddata

5

कंप्यूटर दृष्टि में आपके मामले में RANSAC या MSAC का उपयोग करने का एक मानक तरीका है;

  1. विमान है कि विमान को अंक के सभी के लिए 3 अंक
  2. योग त्रुटियों (विमान के लिए दूरी) द्वारा परिभाषित की गणना आबादी
  3. से 3 यादृच्छिक अंक ले लो।
  4. 3 अंक रखें जो सबसे छोटी त्रुटियों को दिखाते हैं (और सीमा के भीतर गिरते हैं)। //www.mathworks:
  5. दोहराएँ एन पुनरावृत्तियों (? देख RANSAC सिद्धांत एन चयन करने के लिए, मेरा सुझाव हो सकता है 50)

http://en.wikipedia.org/wiki/RANSAC

संबंधित मुद्दे