raíz cuadrada y cuadrado de vectores dobles en C++
-
18-09-2020 - |
Pregunta
Me gustaría calcular el cuadrado y la raíz cuadrada de un vector de dobles.Por ejemplo dado:
vector<double> Array1(10,2.0);
vector<double> Array2(10,2.0);
for(unsigned int i=0; i<Array1.size(); i++)
Array1[i] = sqrt(Array1[i]);
for(unsigned int i=0; i<Array2.size(); i++)
Array2[i] = Array2[i] * Array2[i];
¿Hay alguna manera de hacer lo anterior usando una función STL como transformar?¿Quizás hay una función SQRT incorporada que actúa en matrices?
Solución
La misma respuesta que tu pregunta anterior...
static inline double computeSquare (double x) { return x*x; }
...
std::transform(Array1.begin(), Array1.end(), Array1.begin(), (double(*)(double)) sqrt);
std::transform(Array2.begin(), Array2.end(), Array2.begin(), computeSquare);
(El (double(*)(double))
lanzar es forzar el sqrt
función para utilizar el double
variante: es una función sobrecargada.Podrías usar std::ptr_fun<double, double>(sqrt)
para evitar el yeso.)
Otros consejos
i Piensa El segundo transform
puede simplificarse, simplemente no estoy seguro de cómo.
#include <algorithm>
using namespace std;
vector<double> Array1(10,2.0);
vector<double> Array2(10,2.0);
transform( Array1.begin(), Array1.end(), Array1.begin(), sqrt );
transform( Array2.begin(), Array2.end(), Array2.begin(), Array2.begin(), multiplies<double>() );
Si su compilador tiene soporte C ++ 0X, La respuesta de KennyTM puede ser ajustada un poco:
std::transform(Array1.begin(), Array1.end(), Array1.begin(), [](double f)->double { return f * f; });
O si está usando BOOST, puede usar Boost :: Lambda:
#include <boost/lambda.hpp>
using namespace boost::lambda;
std::transform(Array1.begin(), Array1.end(), Array1.begin(), _1 * _1);