una sumar suma matriz matrices los lenguaje fila elementos ejemplos como c++ matrix eigen

c++ - sumar - suma de elementos de una matriz matlab



Aplicar la funciĆ³n a todos los elementos de la matriz Eigen. (3)

Tengo un Eigen::MatrixXd y me gustaría modificar todos sus elementos aplicando una función por componentes. Por ejemplo:

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

¿Hay alguna manera de lograr este resultado?


La respuesta de @ vsoftco me dio el 99% de la solución a este problema, pero por alguna razón, pasar &Exp a .unaryExpr() me estaba dando errores de compilación (g ++, c + 11, Eigen 3.3.5 dio un error relacionado con: base type ''double (*)(double)'' fails to be a struct or class type ).

Sin embargo, encontré que crear un objeto std::function y pasar eso, en cambio, solucionó esto. Copiando el ejemplo de @vsoftco:

#include <cmath> #include <iostream> #include <Eigen/Core> double Exp(double x) { return std::exp(x); } int main() { Eigen::MatrixXd m(2, 2); m << 0, 1, 2, 3; std::function<double(double)> exp_wrap = Exp; //added to @vsoftco''s answer std::cout << m << std::endl << "becomes: "; std::cout << std::endl << m.unaryExpr(exp_wrap) << std::endl; //and used here }

No estoy seguro de cuánta sobrecarga con el uso de un objeto std::function (o std::ptr_fun ) en comparación con std::ptr_fun &Exp , pero no puedo hacer que funcione sin estas alternativas.

Aclamaciones


La respuesta de vsoftco es muy general y es buena para funciones personalizadas. Sin embargo, hay una forma más sencilla para muchas de las funciones de uso común. Adaptando su ejemplo podemos usar array s y se ve así:

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


Sí, use la función miembro Eigen::MatrixBase<>::unaryExpr() . Ejemplo:

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