Calcular el producto punto de dos vectores en C++

Jinku Hu 12 octubre 2023
  1. Use std::inner_product para calcular el producto punto de dos vectores en C++
  2. Use std::transform_reduce para calcular el producto punto de dos vectores en C++
  3. Utiliza std::transform_reduce y std::ejecución::par para calcular el producto puntual de dos vectores
Calcular el producto punto de dos vectores en C++

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
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

Artículo relacionado - C++ Vector