2012-11-20 45 views
7

मान लें कि mat नीचे Eigen::MatrixXd प्रकार है और इसमें पहले से ही कुछ डेटा है। डुप्लिकेट स्मृति से बचने के प्रयास में, मैं कच्चे स्मृति हिस्सा Eigen3 द्वारा आवंटित करने के लिए सूचक से एक flann::Matrix<double> वस्तु का दृष्टांत करने की कोशिश की:ईजिन :: MatrixXd flann :: मैट्रिक्स <double> रूपांतरण

flann::Matrix<double> input(const_cast<double *>(mat.data(), mat.rows(), mat.cols()) 

लेकिन, मेरा एल्गोरिथ्म कचरा आउटपुट, लेकिन बदसूरत के साथ ठीक है:

flann::Matrix<double> input(new double[mat.rows()*mat.cols()], mat.rows(), mat.cols()); 
for (int i = 0; i < mat.rows(); i++) { 
for (int j = 0; j < mat.cols(); j++) { 
    input[i][j] = mat(i, j); 
} 

}

मैं फ्लान से आधार Matrix_ प्रकार उपवर्ग को Eigen3 मैट्रिक्स करने के लिए एडॉप्टर बनाने का विकल्प की जांच की। समस्या यह है कि Matrix_[] ऑपरेटर के कार्यान्वयन के कार्यान्वयन पर निर्भर करता है। यह मुझे महसूस करता है कि ऊपर दिखाए गए सरल (लेकिन टूटे हुए) समाधान की तुलना में मुझे एक ही स्मृति समस्या का सामना करना पड़ सकता है।

आपको ऐसा व्यवहार क्या समझा सकता है?

  • पंक्ति/स्तंभ-प्रमुख मुद्दा
  • इनर, बाहरी कदम मुद्दा
  • मेमोरी संरेखण असंगतियां
  • Eigen::Map मीठा होता है, लेकिन मैं के लिए क्या नहीं देख रहा हूँ। यह मेरी कोड को फिर से लिखना पुस्तकालय libflann आधार से दुर्भाग्य से बहुत दूर stl::vector<std::vector<double> > आधार प्रकार के रूप में और Eigen::Map उन्हें इस्तेमाल करने Eigen::MatrixXd
  • http://nanoflann-reference.mrpt.org/svn/structnanoflann_1_1KDTreeEigenMatrixAdaptor.html लिए प्रयोग करने योग्य होने के लिए करने के लिए चूसना होगा।

उत्तर

0

ईजिन :: मैट्रिक्स स्टोर डेटा लगातार, इसलिए आपको समस्याएं नहीं मिलनी चाहिए। अगर आप इस पर एक ईजिन :: मैट्रिक्स बनाने की कोशिश कर रहे हैं तो संरेखण समस्या हो सकती है (लेकिन मैं कल्पना नहीं कर सकता कि यह कैसे संभव है)। डिफ़ॉल्ट रूप से Eigen :: मैट्रिक्स कॉलम-प्रमुख है, यह आपकी समस्या हो सकती है। मुझे नहीं पता कि फ्लैन मैट्रिस का इलाज कैसे करता है, अगर वे पंक्ति-प्रमुख हैं, तो यह है। निम्नलिखित उदाहरण Eigen :: Matrix < डबल, -1, -1, Eigen :: RowMajor> मैट के लिए काम करता है और Eigen :: MatrixXd के साथ विफल रहता है।

int k = 0; 
for (int i = 0; i<mat.rows(); ++i) 
{ 
    for (int j = 0; j<mat.cols(); ++j, ++k) { 
     mat(i, j) = k; 
    } 
} 

double* mptr = mat.data(); 
for (int i = 0; i<mat.rows() * mat.cols(); ++i) { 
    assert(mptr[i] == i); 
} 

मैं के बारे में Eigen :: मानचित्र अपने शिकायत मिल नहीं किया है। यह कुछ डेटा को ईजिन मैट्रिक्स के रूप में पेश करने का सबसे अच्छा तरीका है (ध्यान दें कि यह अभी भी डिफ़ॉल्ट रूप से कॉलम-प्रमुख होगा), मैट्रिक्स से उप-वर्गीकरण, या कस्टम ईजिन अभिव्यक्ति को कार्यान्वित करना दर्दनाक हो सकता है।

7

मुझे libflann के लेखक मारियस मुजा से भी पुष्टि मिली, flann::Matrix पंक्ति-प्रमुख क्रम में स्टोर करता है जबकि ईजिन डिफ़ॉल्ट रूप से कॉलम-प्रमुख का उपयोग करता है। यहां जवाब है कि उसने मुझे ईमेल द्वारा दिया:

समस्या सबसे अधिक संभावना है कि ईजिन कॉलम-प्रमुख क्रम में मैट्रिक्स स्टोर करता है> जबकि FLANN को उन्हें पंक्ति-प्रमुख क्रम में आवश्यकता होती है।

एक समाधान के बजाय Matrix<double, Dynamic, Dynamic, RowMajor> का उपयोग करना होगा, फिर FLANN और Eigen matrices एक ही स्मृति साझा कर सकते हैं, अन्यथा एक प्रति की आवश्यकता होगी। मारियस मुजा

+0

मुझे नैनोफ़्लान के साथ एक ही समस्या थी (हालांकि यह दोनों तरीकों से काम करता था लेकिन डिफ़ॉल्ट कॉलम-मेजर मेरे आवेदन के लिए बहुत बेकार था), धन्यवाद! –