2016-09-07 11 views
5

3 डी स्पेस में एन पॉइंट्स के सेट को देखते हुए, मैं एसवीडी और ईजिन का उपयोग करके सबसे अच्छा फिटिंग विमान ढूंढने की कोशिश कर रहा हूं।ईजीन और एसवीडी पॉइंट्स के सेट दिए गए सर्वश्रेष्ठ फिटिंग विमान को खोजने के लिए

मेरे एल्गोरिथ्म है:

  1. केंद्र डेटा बिंदुओं के आसपास (0,0,0)।
  2. बिंदु निर्देशांक के 3xN मैट्रिक्स फॉर्म।
  3. मैट्रिक्स के एसवीडी की गणना करें।
  4. विमान के सामान्य के रूप में कम से कम एकवचन मूल्य के अनुरूप सबसे छोटा एकवचन वेक्टर सेट करें।
  5. सामान्य से विमान से सामान्य ∙ केंद्र के रूप में दूरी निर्धारित करें।

मैं समझ नहीं Eigen's SVD Module उपयोग करने के लिए कैसे छोटी से छोटी विलक्षण वेक्टर बिंदु के कम से कम विलक्षण मान के संगत को खोजने के लिए मैट्रिक्स समन्वय करता है।

अब तक मैं इस कोड है (कदम 1, 2 और एल्गोरिथ्म के 5):

Eigen::Matrix<float, 3, 1> mean = points.rowwise().mean(); 
const Eigen::Matrix3Xf points_centered = points.colwise() - mean; 

int setting = Eigen::ComputeThinU | Eigen::ComputeThinV; 
Eigen::JacobiSVD<Eigen::Matrix3Xf> svd = points_centered.jacobiSvd(setting); 

Eigen::Vector3d normal = **???** 

double d = normal.dot(mean); 
+0

आपने अभी तक किस कोड का प्रयास किया है? –

+0

प्रश्न के लिए कोड जोड़ा गया। – dustymax

+0

इस [प्रस्तुति] के स्लाइड 97-99 देखें (http://downloads.tuxfamily.org/eigen/eigen_CGLibs_Giugno_Pisa_2013.pdf)। – ggael

उत्तर

3

U = svd.matrixU() को संकेतित करते, वैक्टर U.col(0) और U.col(1) अपने विमान के लिए एक आधार परिभाषित करता है और U.col(2) अपने विमान के लिए सामान्य है।

U.col(0) भी सबसे बड़ा मानक विचलन के साथ दिशा को परिभाषित करता है।

के बजाय आपको ComputeFullU ध्वज का उपयोग करना चाहिए ताकि सही अंक भी हो सकें, भले ही आपके अंक coplanar हों।

1

आपकी समस्या कैसे Eigen JacobiSVD मॉड्यूल का उपयोग कर एक कम से कम वर्ग फिटिंग करने के लिए मूल रूप से है। एक अधिक उपयोगी उदाहरण के साथ यहां एक link है। कम-स्क्वायर फिटिंग का मूल विचार यह है कि आप पहले एन अंकों में से एक के साथ सभी एन -1 अंकों के वेक्टर अंतर लेते हैं, और फिर दो ऐसे वैक्टरों के रैखिक संयोजन के रूप में ऐसे सभी एन -1 वैक्टरों को अनुमानित करने का प्रयास करते हैं, जो 2 डी विमान को परिभाषित करता है।

+0

यह लिंक _normal_ कम-वर्ग फिटिंग के बारे में है, जबकि प्रश्न ** कम से कम वर्ग ** के बारे में है। – ggael

+0

मुझे एहसास है कि मेरा एल्गोरिदम इष्टतम नहीं है। एन एन पॉइंट्स में से एक के बजाय, सेंट्रॉइड को सर्वश्रेष्ठ फिट विमान पर रखना अधिक समझ में आता है। मैंने बस लैग्रेज मल्टीप्लायर का उपयोग करके गणितीय रूप से व्युत्पन्न किया है कि प्रश्न में दिए गए एल्गोरिदम पहले से ही एन पॉइंट-टू-प्लेन दूरी के वर्गों के योग को कम करता है। यह एक समन्वय-स्वतंत्र निष्कर्ष है। व्युत्पन्न के बाद, एल्गोरिदमिक रूप से करने के लिए कोई और कम-वर्ग नहीं है। एल्गोरिदम लागू करने के लिए सही कोड बिलक्स के उत्तर में दिया गया है। –

+0

मेरा उदाहरण सामान्य कम-स्क्वायर फिटिंग करता है, जिसमें एक ओवर-निर्धारित रैखिक समीकरण 'एक्स = बी' कम से कम वर्ग सूत्र 'x = (ए' * ए)^(- 1) * ए '* का उपयोग करके हल किया जाता है। b'। कार्यान्वयन अधिक चालाक है। पहले एक एसवीडी ए = यू * एस * वी 'के साथ किया जाता है और फिर समाधान' एक्स = वी * एस^(- 1) * यू '* बी' है। यह 'ए' * ए' को बदलने से बचाता है, जिसमें 'ए' की तुलना में स्क्वायर हालत संख्या होती है। –

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