2012-11-23 19 views
7

पर एक ईजिन मैट्रिक्स मानचित्र करें मैंने हाल ही में Eigen लाइब्रेरी का उपयोग करना शुरू कर दिया है। मुझे एक सी/सी ++ सरणी में एक ईजिन मैट्रिक्स मैपिंग का सवाल मिला। एक ईजिन मैट्रिक्स डिफ़ॉल्ट रूप से कॉलम महारत हासिल है। तो अगर मैं एक C/C++ सरणी के लिए एक मैट्रिक्स मैप करने के लिए,एक सी एरे

double a[10]; 
double *p = &a[0]; 
MatrixXd(2,5) m; 
for (int i=0; i<2;i++) 
    for (int j=0; j<5;j++) 
     m(i,j) = i+j; 
cout<<m<<endl; 
Eigen::Map<MatrixXd>(p,2,5) = m; 
for (int i=0; i<10; i++) 
    cout<<a[i]<<" "; 
cout<<endl; 

उत्पादन होता है निम्नलिखित कोड का उपयोग करें:

0 1 2 3 4 
1 2 3 4 5 
0 1 1 2 2 3 3 4 4 5 

अगर मैं मीटर की परिभाषा बदलने के रूप में पंक्ति majored:

Matrix <double,2,5,RowMajor> m; 

मैं उम्मीद उत्पादन इस तरह दिखता है:

0 1 2 3 4 
1 2 3 4 5 
0 1 2 3 4 1 2 3 4 5 

लेकिन असल में परिणाम अभी भी पहले जैसा ही था। मेरा सवाल यह है कि एक ईजिन मैट्रिक्स को सी/सी ++ सरणी में मैप करने का कोई तरीका है ताकि सरणी का डेटा पंक्ति आधारित हो?

मैंने पाया कि मैं वांछित परिणाम प्राप्त करने के लिए matrix.data() memember समारोह का उपयोग कर सकते हैं, लेकिन मैं सोच रहा हूँ कि क्या मैं इस प्रयोग के नक्शे कर सकते हैं:

उपयोग matrix.data() काम करता है:

double a[10]; 
double *p = &a[0]; 
Matrix <double,2,5,RowMajor> m; 
for (int i=0; i<2;i++) 
    for (int j=0; j<5;j++) 
     m(i,j) = i+j; 
double *p1 = m.data(); 
for (int i=0; i<10; i++) 
    cout<<p1[i]<<" "; 
cout<<endl; 

उत्तर

7

यह मैट्रिक्स m कि मायने रखती है के प्रकार, लेकिन प्रकार Map टेम्पलेट में उपयोग नहीं किया है। आपको पंक्ति प्रमुख होने के लिए Map टेम्पलेट में उपयोग किए गए प्रकार को बदलना होगा।

Eigen::Map<Matrix<double,2,5,RowMajor> >(p,2,5) = m; 
+0

यह काम करता है। धन्यवाद। – Rainfield

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