Calcular el producto punto de dos vectores en C++
-
Use
std::inner_product
para calcular el producto punto de dos vectores en C++ -
Use
std::transform_reduce
para calcular el producto punto de dos vectores en C++ -
Utiliza
std::transform_reduce
ystd::ejecución::par
para calcular el producto puntual de dos vectores
Este artículo demostrará múltiples métodos para calcular el producto punto de dos vectores en C++.
El producto punto es la suma de los productos de los elementos correspondientes de los dos vectores. Supongamos que tenemos dos vectores - {1, 2, 3}
y {4, 5, 6}
, y el producto punto de estos vectores es 1*4 + 2*5 + 3*6 = 32
.
Use std::inner_product
para calcular el producto punto de dos vectores en C++
std::inner_product
es parte de la biblioteca de algoritmos numéricos de C++ incluida en el encabezado <numeric>
. El método calcula la suma de productos en dos rangos, el primero de los cuales se especifica con los iteradores begin
/end
y el segundo rango con sólo begin
. La función también toma init
como el cuarto parámetro para inicializar el valor del acumulador. El valor de retorno es el valor del producto del punto final de los rangos dados. Note que std::inner_product
siempre realiza operaciones en un orden dado.
#include <iostream>
#include <iterator>
#include <numeric>
#include <vector>
using std::copy;
using std::cout;
using std::endl;
using std::vector;
int main() {
vector<int> vec1{1, 2, 3, 4, 5};
vector<int> vec2{2, 4, 6, 8, 10};
copy(vec1.begin(), vec1.end(), std::ostream_iterator<int>(cout, "; "));
cout << endl;
copy(vec2.begin(), vec2.end(), std::ostream_iterator<int>(cout, "; "));
cout << endl;
cout << "Scalar product is: "
<< inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
cout << endl;
return EXIT_SUCCESS;
}
Producción :
1; 2; 3; 4; 5;
2; 4; 6; 8; 10;
Scalar product is: 110
Use std::transform_reduce
para calcular el producto punto de dos vectores en C++
A diferencia del método anterior, std::transform_reduce
puede realizar operaciones en rangos fuera de orden, maximizando así el rendimiento. std::transform_reduce
es esencialmente la versión paralelizada del algoritmo std::inner_product
. El siguiente ejemplo demuestra la ejecución de la función con los mismos argumentos que se pasaron en el ejemplo anterior.
#include <iostream>
#include <iterator>
#include <numeric>
#include <vector>
using std::copy;
using std::cout;
using std::endl;
using std::inner_product;
using std::vector;
int main() {
vector<int> vec1{1, 2, 3, 4, 5};
vector<int> vec2{2, 4, 6, 8, 10};
copy(vec1.begin(), vec1.end(), std::ostream_iterator<int>(cout, "; "));
cout << endl;
copy(vec2.begin(), vec2.end(), std::ostream_iterator<int>(cout, "; "));
cout << endl;
cout << "Scalar product is: "
<< std::transform_reduce(vec1.begin(), vec1.end(), vec2.begin(), 0);
return EXIT_SUCCESS;
}
Resultado:
1; 2; 3; 4; 5;
2; 4; 6; 8; 10;
Scalar product is: 110
Utiliza std::transform_reduce
y std::ejecución::par
para calcular el producto puntual de dos vectores
Alternativamente, se puede especificar adicionalmente una política de ejecución para el algoritmo std::transform_reduce
. Este método ofrece más control al programador, ya que el flujo del programa puede personalizarse con las reglas de ejecución definidas en este manual. Aunque hay ganancias de rendimiento al usar transform_reduce
, uno debe siempre tener en cuenta las posibles condiciones de carrera cuando se especifica la política de ejecución paralela.
#include <execution>
#include <iostream>
#include <iterator>
#include <numeric>
#include <vector>
using std::copy;
using std::cout;
using std::endl;
using std::inner_product;
using std::vector;
int main() {
vector<int> vec1{1, 2, 3, 4, 5};
vector<int> vec2{2, 4, 6, 8, 10};
copy(vec1.begin(), vec1.end(), std::ostream_iterator<int>(cout, "; "));
cout << endl;
copy(vec2.begin(), vec2.end(), std::ostream_iterator<int>(cout, "; "));
cout << endl;
cout << "Scalar product is: "
<< std::transform_reduce(std::execution::par, vec1.begin(), vec1.end(),
vec2.begin(), 0);
return EXIT_SUCCESS;
}
Producción :
1; 2; 3; 4; 5;
2; 4; 6; 8; 10;
Scalar product is: 110
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook