2013-06-04 7 views
5

से एक Eigen मैट्रिक्स बनाएं मैं अनिवार्य रूप से करना चाहते हैं क्या इस समारोह को लागू है। मुझे पता है कि इस तरह कुछ हासिल करने का मानक तरीका मानचित्र के साथ है, लेकिन मेरे पास इस दृष्टिकोण के साथ कई मुद्दे हैं।एक सी सरणी

  1. मैं अपने कोड के बाकी के पुनर्लेखन के लिए इनपुट के रूप में नक्शे को स्वीकार नहीं करना चाहते हैं (एक अस्थायी मैट्रिक्स में मानचित्र को कॉपी किए बिना, कि है)। मुझे पता है कि मैट्रिक्सबेस ऑब्जेक्ट्स इनपुट के रूप में लेने के लिए अपने कार्यों को सामान्यीकृत करके ऐसा कर सकता हूं, लेकिन मैंने अपने इनपुट में विशिष्ट मैट्रिक्स टेम्पलेट्स को किसी कारण से परिभाषित किया है - यदि मेरा फ़ंक्शन Matrix<T, Dynamic, Dynamic, ColMajor> लेता है, तो ऐसा इसलिए होता है क्योंकि उस प्रकार के केवल मैट्रिक्स का उपयोग किया जाना चाहिए इनपुट के रूप में।

  2. आदर्श रूप से, मैं बनाया गया मैट्रिक्स डेटा पॉइंटर का स्वामित्व लेना चाहता हूं, इसलिए मैं सिर्फ साझा_ptr के माध्यम से मैट्रिक्स का प्रबंधन कर सकता हूं और मूल डेटा पॉइंटर को फिर से स्पर्श नहीं करना चाहता।

मेरे प्रारंभिक सोचा मैं एक गैर-आरंभिकृत गतिशील आकार मैट्रिक्स वस्तु बनाने की तरह कुछ कर सकता है कि, और फिर बस वस्तु के आयाम और डेटा सूचक सेट था, लेकिन इस Eigen एपीआई में संभव हो सकता है नहीं लगता है। क्या किसी को किसी भी कामकाज के बारे में पता है?

उत्तर

3

ईजीन :: मैट्रिक्स को कभी भी बाहरी बफर को सीधे लपेटने की अनुमति नहीं दी जाएगी, और इसके लिए कई अच्छे कारण हैं जिनमें एबीआई संगतता, गतिशील रूप से आवंटित और स्थिर रूप से आवंटित मैट्रिक्स में एपीआई स्थिरता शामिल है।

template<typename T> struct Foo { 
    T* data; 
    DenseIndex rows, cols; 
    Matrix<T, Dynamic, Dynamic, ColMajor>& asMatrix() { 
    return reinterpret_cast<Matrix<T, Dynamic, Dynamic, ColMajor>&>(*this); 
    } 
}; 

एक अन्य समाधान devel शाखा (सुंदर स्थिर) को स्थानांतरित करने के लिए किया जाएगा, और नए Ref<> वर्ग था का उपयोग करें:

एक बदसूरत वैकल्पिक हल MatrixX_ रूप में एक ही लेआउट के साथ एक struct को परिभाषित करने के होगा आपकी सटीक समस्या को हल करने के लिए डिज़ाइन किया गया है, और और भी बहुत कुछ। इसका documentation उचित रूप से इसका उपयोग करने के लिए पर्याप्त होना चाहिए। एकमात्र कठिनाई यह है कि आप आसानी से स्केलर प्रकार को templatize करने में सक्षम हैं क्योंकि रेफरी <> मैट्रिक्स या मानचित्र का आधार वर्ग नहीं है, और इसलिए आपको स्केलर प्रकार को स्पष्ट रूप से निर्दिष्ट करके या फैन < बनाकर अपने फोन्क्शन को कॉल करना होगा > अपने आप को कॉपी:

foo<T>(M); 
foo(Ref<MatrixXd>(M)); 
+1

आपका बदसूरत कामकाज सबसे आसान समाधान प्रतीत होता है, लेकिन क्या यह काफी खतरनाक नहीं है? मैं फिलहाल वास्तविक संकलित कोड पोर्टेबल होने के बारे में बहुत चिंतित नहीं हूं, लेकिन क्या कोई गारंटी है फू और एक टेम्पलेटेड मैट्रिक्सएक्स एक ही इन-मेमोरी व्यवस्था के साथ खत्म हो जाएगा? दूसरा विकल्प के रूप में, यह लग रहा है जैसे मैं अपने तरीकों को फिर से लिखने सकता है की तरह कुछ देखने के लिए: टेम्पलेट शून्य फू (स्थिरांक रेफरी <स्थिरांक मैट्रिक्स <टी, गतिशील, गतिशील, ColMajor>>) और यह उन्हें अनुमति होगी मैट्रिक्स <टी, गतिशील, गतिशील, ColMajor> और मानचित्र <मैट्रिक्स <टी, गतिशील, गतिशील, ColMajor >> इनपुट दोनों स्वीकार करने के लिए? – user2452966

+1

मेमोरी लेआउट की गारंटी है (ईजिन संस्करणों में एबीआई संगतता)। रेफरी के लिए <> हां, इसका उपयोग कैसे करें।समस्या यह है कि आंशिक रूप से टेम्पलेट पैरामीटर के साथ परिभाषित होने पर यह कम सुविधाजनक होता है क्योंकि मैट्रिक्स या मानचित्र को रेफ <> ​​का वारिस नहीं मिलता है और इसलिए संकलक को सही टेम्पलेट तर्कों को तुरंत लागू करने की अनुमति नहीं दी जाएगी। तो आपको या तो इसे स्पष्ट रूप से प्रदान करना होगा, या स्पष्ट रूप से रेफरी <> में रूपांतरण करना होगा, या यदि आप केवल 2 या 3 स्केलर प्रकारों से चिंतित हैं, तो आप 2-3 ओवरलोड को सामान्य संस्करण (स्वच्छतम समाधान) भी कह सकते हैं)। – ggael

-1

मुझे लगता है कि समाधान के रूप में आसान है निम्नलिखित के रूप में:

float **data = new float[numRows][numCols]; 
MatrixXf M(numRows,numCols); 
M.data() = data; 

डिफ़ॉल्ट रूप से, एक मैट्रिक्स में डेटा आयोजित किया जाता है कॉलम मेजर, तो आप का उपयोग करने के लिए अपने मैट्रिक्स चाहते हैं एक पंक्ति मेजर ऑर्डर में फ्लोट ** डेटा, आप असाइनमेंट के बाद मैट्रिक्स को ट्रांसफर कर सकते हैं।

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