2012-11-25 85 views
5

के रूप में वापस लौटाएं, मैं एक फ़ंक्शन के एक भाग के रूप में एक मैट्रिक्स के ब्लॉक को वापस करने का प्रयास कर रहा हूं। मान लीजिए कि मेरी समारोह इस तरह दिखता है:ईजिन लाइब्रेरी: एक फ़ंक्शन में एक मैट्रिक्स ब्लॉक को lvalue

Block<Derived> getBlock(MatrixXd & m, int i, int j, int row, int column) 
{ 
    return m.block(i,j,row,column); 
} 

यह पता चला है के रूप में, ऐसा लगता है C++ कम्पाइलर समझता है कि कि ब्लॉक() ऑपरेटर केवल अस्थायी मूल्य और इसलिए यह लौटने के रूप में एक lvalue संकलक द्वारा निषिद्ध है देता है। हालांकि, ईजिन दस्तावेज में कुछ उदाहरण हैं कि हम ईजिन को एक लैवल्यू (http://eigen.tuxfamily.org/dox/TutorialBlockOperations.html#TutorialBlockOperationsUsing) के रूप में उपयोग कर सकते हैं, इसलिए मैं सोच रहा हूं कि हम फ़ंक्शन के साथ ऐसा कैसे नहीं कर सके वापसी।

a.block(0,0,2,3) = a.block(2,1,2,3); 

धन्यवाद!

मेरे बुनियादी समाधान को पता है कि व्युत्पन्न टाइप आप ब्लॉक होना चाहते है:

उत्तर

6

मैं मैं अपने आप को क्या मिला तो यह किसी और के लिए उपयोगी हो सकता है रखना चाहते हैं। इस मामले में:

Block<MatrixXd> getBlock(MatrixXd & m, int i, int j, int row, int column) 
{ 
    return m.block(i,j,row,column); 
} 

यह मेरे लिए दिलचस्प है सूचना के लिए है कि इस विधि डिफ़ॉल्ट रूप से मैट्रिक्स मीटर की सामग्री के संदर्भ वापस आ जाएगी। तो अगर हम करते हैं:

MatrixXd m = MatrixXd::Zero(10,10); 
Block<MatrixXd> myBlock = getBlock(m, 1, 1, 3, 3); 
myBlock << 1, 0, 0, 
      0, 1, 0, 
      0, 0, 1; 

मैट्रिक्स एम में सामग्री भी संशोधित की जाएगी। ध्यान दें कि, हालांकि,

MatrixXd m = MatrixXd::Zero(10,10); 
MatrixXd myBlock = getBlock(m, 1, 1, 3, 3); 
myBlock << 1, 0, 0, 
      0, 1, 0, 
      0, 0, 1; 

काम नहीं करेगा। मेरी समझ यह है कि एक बार जब हम ब्लॉक को दूसरे प्रकार में परिवर्तित करते हैं तो ईजिन रूपांतरण से पहले डेटा की एक प्रति बनाता है।

+0

अभिव्यक्ति टेम्पलेट्स के लिए धन्यवाद, ब्लॉक() वास्तव में ब्लॉक को प्रतिलिपि नहीं देता है, इसके बजाय यह केवल –

+0

@ user3183610 अभिव्यक्ति देता है ताकि मूल्यांकन के लिए ब्लॉक (अभिव्यक्ति) को कैसे बल दिया जाए। मेरा मतलब वैध लैवल्यू के रूप में है। – stanleyerror