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