2015-11-18 5 views
12

पर फ़ंक्शन लागू करें मेरे पास Eigen::MatrixXd है और मैं फ़ंक्शन घटक-वार लागू करके अपने सभी तत्वों को संशोधित करना चाहता हूं। उदाहरण के लिए:सभी ईजिन मैट्रिक्स तत्व

MatrixXd m = ...; 

for each m[i][j]: 
    m[i][j] = exp(m[i][j]); 

क्या इस परिणाम को प्राप्त करने का कोई तरीका है?

उत्तर

18

हां, Eigen::MatrixBase<>::unaryExpr() सदस्य फ़ंक्शन का उपयोग करें। उदाहरण:

#include <cmath> 
#include <iostream> 

#include <Eigen/Core> 

double Exp(double x) // the functor we want to apply 
{ 
    return std::exp(x); 
} 

int main() 
{ 
    Eigen::MatrixXd m(2, 2); 
    m << 0, 1, 2, 3; 
    std::cout << m << std::endl << "becomes: "; 
    std::cout << std::endl << m.unaryExpr(&Exp) << std::endl; 
} 
+0

क्या यह सही होगा? "m.unaryExpr (& std :: exp)" –

+5

@Xinghihi नहीं, क्योंकि ['std :: exp'] (http://en.cppreference.com/w/cpp/numeric/math/exp) में अधिभार है, और 'unaryExpr' अकेले' std :: exp' से फ़ैक्टर हस्ताक्षर को कम करने में असमर्थ है (यानी, 1 से अधिक उम्मीदवार हैं)। यदि आप 'm.unaryExpr (& std :: exp)' जैसे फ़ैक्टर प्रकार निर्दिष्ट करके कंपाइलर को "मदद" करते हैं, तो यह काम करेगा। – vsoftco

+0

बहुत बहुत धन्यवाद, आप सही हैं। –

17

vsoftco के जवाब बहुत ही सामान्य है और कस्टम कार्यों के लिए अच्छा है। हालांकि, आमतौर पर उपयोग किए जाने वाले कई कार्यों के लिए एक आसान तरीका है। अपने उदाहरण को अपनाने के लिए हम array एस का उपयोग कर सकते हैं और ऐसा लगता है:

#include <iostream> 
#include <Eigen/Core> 

int main() 
{ 
    Eigen::MatrixXd m(2, 2); 
    m << 0, 1, 2, 3; 
    std::cout << m << "\nbecomes:\n"; 
    std::cout << m.array().exp() << std::endl; 
    return 0; 
} 
+0

यह जानना अच्छा है! – vsoftco

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