2013-02-19 32 views
9

documentation का कहना है:Eigen में पंक्ति वेक्टर से कॉलम वेक्टर को कैसे परिवर्तित करें?

... Eigen में, वैक्टर सिर्फ मेट्रिसेस, या तो 1 पंक्ति या 1 स्तंभ के साथ का एक विशेष मामला है। वह मामला जहां उनके पास 1 कॉलम सबसे आम है; ऐसे वैक्टर को कॉलम-वेक्टर कहा जाता है, अक्सर विक्टर के रूप में संक्षेप में संक्षिप्त होता है। दूसरे मामले में जहां उनके पास 1 पंक्ति है, उन्हें पंक्ति-वैक्टर कहा जाता है।

हालांकि इस कार्यक्रम आउटपुट unintuitive परिणाम:

#include <eigen3/Eigen/Dense> 
#include <iostream> 

typedef Eigen::Matrix<double, 1, Eigen::Dynamic> RowVector; 

int main(int argc, char** argv) 
{ 
    RowVector row(10); 
    std::cout << "Rows: " << row.rows() << std::endl; 
    std::cout << "Columns: " << row.cols() << std::endl; 
    row.transposeInPlace(); 
    std::cout << "Rows: " << row.rows() << std::endl; 
    std::cout << "Columns: " << row.cols() << std::endl; 
} 

आउटपुट:

Rows: 1 
Columns: 10 
Rows: 1 
Columns: 10 

यह एक बग है, या मैं पुस्तकालय को गलत तरीके से उपयोग कर रहा हूँ?

+2

मैं विकास के लिए एक ज़ोर जोड़ा इस (गलत) उपयोग के खिलाफ सुरक्षा के लिए ईजिन की शाखा। –

उत्तर

11

transposeInPlace के लिए दस्तावेज़ का कहना है:

नोट

अगर मैट्रिक्स वर्ग नहीं है, तो *this एक आकार बदलने योग्य मैट्रिक्स होना चाहिए।

आप दोनों गतिशील पंक्तियों और स्तंभों के लिए अपने प्रकार की आवश्यकता होगी:

Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic> 

हालांकि, वहाँ पहले से ही इसके लिए एक typedef: MatrixXd

वैकल्पिक रूप से, अगर आप अभी भी संकलन समय आकार चाहते हैं, आप tranpose बजाय transposeInPlace का उपयोग आप एक नया स्थानांतरित मैट्रिक्स देने के लिए कर सकते हैं के बजाय संशोधित मौजूदा:

typedef Eigen::Matrix<double, Eigen::Dynamic, 1> ColumnVector; 
ColumnVector column = row.transpose(); 
+1

धन्यवाद! यह बात है –