2015-11-18 18 views

risposta

18

Sì, utilizzare la funzione membro Eigen::MatrixBase<>::unaryExpr(). Esempio:

#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

sarebbe corretto? "m.unaryExpr (& std :: exp)" –

+5

@XingShi No, perché ['std :: exp'] (http://en.cppreference.com/w/cpp/numeric/math/exp) ha sovraccarichi e 'unaryExpr' non è in grado di dedurre la firma del functor da' std :: exp' da solo (cioè, ci sono più di 1 candidati). Se "aiuti" il compilatore specificando il tipo di functor, come 'm.unaryExpr (& std :: exp)', funzionerà. – vsoftco

+0

Grazie mille, hai ragione. –

17

s' vsoftco risposta è molto generale ed è buono per funzioni personalizzate. Tuttavia, esiste un modo più semplice per molte delle funzioni comunemente usate. Adattando il suo esempio possiamo usare array s e assomiglia a questo:

#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

Buono a sapersi! – vsoftco

Problemi correlati