2017-02-21 5 views
5

मैं स्मृति की प्रतिलिपि के बिना Eigen::Matrix का समर्थन करने वाली स्मृति का स्वामित्व लेने का प्रयास कर रहा हूं। data() विधि स्वामित्व बरकरार रखती है। एक ही रास्ता मैं समझ गए होंगे कि इसे कैसे किया मैप की सरणी की अदला-बदली कर रहा है:ईजिन मैट्रिक्स से डेटा को बाहरी करना

Matrix<float, Dynamic, Dynamic, RowMajor> mat = m1 * m2; 
// want ownership of mat's float* 

float* data = mat.data(); // get the pointer 
new (&mat) Eigen::Map<Matrix3f>(NULL); // swap the mapped array with anything else 
// do something with data 

यह इस तरह नहीं दिखता है हुड के नीचे एक प्रति का कारण बनता है, लेकिन मैं सकारात्मक नहीं हूँ। मुझे यह भी यकीन नहीं है कि यह सुरक्षित है।

+0

क्यों आप अपने डेटा की आवश्यकता होने पर केवल ईजिन मैट्रिक्स ऑब्जेक्ट को जीवित नहीं रखते? – rubenvb

+0

@ रुबेनवब मुझे डेटा को दूसरे वातावरण में सौंपने की ज़रूरत है जहां मेरे पास इतना नियंत्रण नहीं है। – ZachB

+0

यह एक बहुत अस्पष्ट बयान है। मुझे अभी भी Eigen ऑब्जेक्ट को जीवित रखने में समस्या दिखाई नहीं दे रही है जबकि अन्य पर्यावरण इसकी बात करता है। – rubenvb

उत्तर

3

Eigen की गड़बड़ी से बाहर स्मृति को कम करना, कम से कम नहीं, क्योंकि आप नहीं जानते कि यह कैसे आवंटित किया गया था या मैट्रिक्स के स्वामित्व में और क्या है।

हालांकि, Map template है, जो आपको एक अज्ञात बफर को ईजिन-मैट्रिक्स-जैसी प्रकार में लपेटने देता है।

यह प्रकार वास्तविक ईजिन मैट्रिक्स नहीं है, इसलिए आपके स्वयं के कस्टम फ़ंक्शन इसके साथ काम नहीं कर सकते हैं, लेकिन इसे Eigen फ़ंक्शंस के साथ काम करना चाहिए।

इस मामले में, आपके पास पहले से ही डेटा है।

using matrix_type = Matrix<float, Dynamic, Dynamic, RowMajor>; 
using mapped_matrix_type = Map<matrix_type>; 

अब हम एक बफर बनाने के लिए, एक mapped_matrix_type में लपेट और निर्दिष्ट करें:

auto raw = std::make_unique<float[]>(m1.rows()*m2.cols()); // maybe backwards 
mapped_matrix_type bob(raw.get(), m1.rows(), m2.cols()); 
bob = m1*m2; 

bob के कच्चे डेटा raw में, एक unique_ptr स्वामित्व बफर (जो आप की जरूरत है सकते हैं release() अगर इसे पूरी तरह से अनजान बनाने के लिए)।

कोई कच्चा भंडारण तंत्र (vector, कच्चे new, जो कुछ भी) raw की जगह ले सकता है।

कोड परीक्षण नहीं किया गया।

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