2012-02-13 10 views
5

जब मैं एक मैट्रिक्स Eigen उपयोग करते हुए, इस तरह बनाने के लिए:मेम्पी क्यों Eigen मैट्रिक्स डेटा कॉपी करने में विफल रहता है, लेकिन std :: प्रति सफल हो?

Eigen::MatrixXd M(3,3); 
    M<< 1.0, 4.0, 7.0, 2.0, 5.0, 8.0, 3.0, 6.0, 9.0 ; 
    std::cout<<M<<std::endl; 

पैदा करता

1 4 7 
2 5 8 
3 6 9 

मैं प्रत्येक तत्व मुद्रण, डेटा के माध्यम से एक सूचक के साथ चल सकता है:

double * d = M.data(); 
    for(int i = 0;i<M.size();i++) 
    { 
    std::cout<<*d<<" "; 
    d++; 
    } 
    std::cout<<std::endl; 

का उत्पादन

1 2 3 4 5 6 7 8 9 
,

double data_copy[9]; 
    std::copy(M.data(),M.data()+M.size(),data_copy); 
    for(int i = 0;i<M.size();i++) 
    { 
    std::cout<<data_copy[i]<<" "; 
    } 
    std::cout<<std::endl; 

1 2 3 4 5 6 7 8 9 

पैदा करता है फिर भी मैं:

मैं भी ढेर पर एक ही प्रकार की एक सरणी पर प्रतिलिपि करने के std :: प्रतिलिपि का उपयोग कर सकते हैं, तो उस सरणी के तत्वों प्रिंट समकक्ष प्रतिलिपि करने के लिए memcpy का उपयोग नहीं कर सकते हैं।

double data_memcopy[9]; 
    memcpy(data_memcopy,M.data(),M.size()); 
    for(int i = 0;i<M.size();i++) 
    { 
    std::cout<<data_memcopy[i]<<" "; 
    } 
    std::cout<<std::endl; 

1 0 0 0 0 0 0 0 0 

कोई अच्छा कारण memcpy नहीं कर रहा है मैं क्या उम्मीद यह होना चाहिए पैदा करता है: यह केवल पहला तत्व कॉपी करने के लिए प्रबंधन करता है? (या मैं इसे अनुचित तरीके से उपयोग कर रहा हूँ?)

उत्तर

8

आप एक डबल के आकार से गुणा करने की आवश्यकता:

memcpy(data_memcopy,M.data(),M.size() * sizeof(double)); 

अन्यथा, आप केवल कॉपी कर रहे हैं M.size() बाइट्स, और प्रत्येक दुगुने से भी ज्यादा है आपकी मशीन पर एक बाइट।

तो शायद आप केवल पहले और दूसरे युगल में लिख रहे थे (वे शायद आपके सिस्टम पर 8 बाइट्स हैं, क्योंकि आपने पहली बार सफलतापूर्वक प्रतिलिपि बनाई है, और दूसरा डबल आप शायद एक बाइट की प्रतिलिपि बना सकता है जो संभवतः शून्य था)।

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