Applica la funzione a tutti gli elementi della matrice Eigen

Ho un Eigen::MatrixXd e vorrei modificare tutti i suoi elementi applicando una funzione componente-saggio. Per esempio:

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

C’è un modo per raggiungere questo risultato?

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

 #include  #include  #include  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; } 

La risposta di vsoftco è molto generica e fa bene alle 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  #include  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; }