2012-08-17 11 views
6

पर वापस मैप करना चाहते हैं, मैं मौजूदा मैट्रिक्सएक्स संरचना में डबल की सरणी को मैप करना चाहता हूं। अब तक मैंने ईजिन मैट्रिक्स को एक साधारण सरणी में मैप करने में कामयाब रहा है, लेकिन मुझे इसे वापस करने का तरीका नहीं मिल रहा है।मैपिंग सरणी को मौजूदा ईजिन मैट्रिक्स

void foo(MatrixXd matrix, int n){ 

double arrayd = new double[n*n]; 
// map the input matrix to an array 
Map<MatrixXd>(arrayd, n, n) = matrix; 

    //do something with the array 
      ....... 
// map array back to the existing matrix 

} 
+1

यह मानचित्र <> फ़ंक्शन क्या है? क्या आप इसे दिखा सकते हैं? –

+0

यह सब मुझे पता है http://eigen.tuxfamily.org/dox/TutorialMapClass.html – Manolete

उत्तर

13

मुझे यकीन नहीं है कि आप क्या चाहते हैं, लेकिन मैं समझाने की कोशिश करूंगा।

आप अपने कोड में डबल और फ्लोट मिश्रण कर रहे हैं (एक मैट्रिक्सएक्स एक मैट्रिक्स है जहां प्रत्येक प्रविष्टि एक फ्लोट है)। मैं इस पल के लिए मान लेगा कि यह अनजान एमडी था कि आप हर जगह डबल का उपयोग करना चाहते हैं; अगर यह वास्तव में आपका इरादा था तो नीचे देखें।

निर्देश Map<MatrixXd>(arrayd, n, n) = matrixmatrix की प्रविष्टियों को arrayd में कॉपी करता है। matrix = Map<MatrixXd>(arrayd, n, n): यह पाश

for (int i = 0; i < n; ++i) 
    for (int j = 0; j < n; ++j) 
     arrayd[i + j*n] = matrix(i, j); 

matrix में arrayd की प्रविष्टियों को कॉपी करने के लिए बराबर है, तो आप उलटा काम का प्रयोग करेंगे।

हालांकि, आमतौर पर निम्नलिखित तकनीक अधिक उपयोगी है:

void foo(MatrixXd matrix, int n) { 
    double* arrayd = matrix.data(); 
    // do something with the array 
} 

मैट्रिक्स में प्रविष्टियों के लिए अब arrayd अंक और आप किसी भी सी ++ सरणी के रूप में यह संसाधित कर सकें। डेटा को matrix और arrayd के बीच साझा किया गया है, इसलिए आपको अंत में कुछ भी वापस कॉपी करने की आवश्यकता नहीं है। संयोग से, आपको फ़ंक्शन foo() पर पास करने की आवश्यकता नहीं है, क्योंकि यह मैट्रिक्स में संग्रहीत है; इसके मान पूछने के लिए matrix.rows() और matrix.cols() का उपयोग करें।

यदि आप एक मैट्रिक्सएक्सएफ को युगल की सरणी में कॉपी करना चाहते हैं, तो आपको स्पष्ट रूप से कास्ट शामिल करना होगा। इसके लिए ईजिन में वाक्यविन्यास है: Map<MatrixXd>(arrayd, n, n) = matrix.cast<double>()

+0

फ्लोट और डबल के साथ भ्रम के बारे में खेद है। अब अपडेट किया गया! – Manolete

+0

यह एक बहुत अच्छी व्याख्या है। क्या होगा अगर सरणी में पूरी तरह से नए डेटा की प्रतिलिपि बनाई गई हो? क्या यह डेटा मैट्रिक्स में भी साझा किया जाएगा? विचार एक जीपीयू को सरणी भेजना है, गणना करना और सीपीयू पर वापस मैट्रिक्सएक्स – Manolete

+0

@Manolete हां में डेटा है, जो काम करना चाहिए –

8

आपको कोई रिवर्स ऑपरेशन करने की आवश्यकता नहीं है।

Eigen :: मानचित्र का उपयोग करते समय आप एक ईजिन वर्ग में कच्चे सरणी का मानचित्रण कर रहे हैं। इसका मतलब है कि अब आप इसे Eighen फ़ंक्शंस का उपयोग करके पढ़ या लिख ​​सकते हैं।

यदि आप मैप किए गए सरणी को संशोधित करते हैं तो परिवर्तन पहले से ही मौजूद हैं। आप बस मूल सरणी तक पहुंच सकते हैं।

float buffer[16]; //a raw array of float 

//let's map the array using an Eigen matrix 
Eigen::Map<Eigen::Matrix4f> eigenMatrix(buffer); 

//do something on the matrix 
eigenMatrix = Eigen::Matrix4f::Identity(); 


//now buffer will contain the following values 
//buffer = [1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1] 
संबंधित मुद्दे