Calcola il prodotto in punti di due vettori in C++

Jinku Hu 12 ottobre 2023
  1. Usa std::inner_product per calcolare il prodotto in punti di due vettori in C++
  2. Usa std::transform_reduce per calcolare il prodotto in punti di due vettori in C++
  3. Usa std::transform_reduce e std::execution::par Calcola il prodotto punto di due vettori
Calcola il prodotto in punti di due vettori in C++

Questo articolo illustrerà più metodi per calcolare il prodotto scalare di due vettori in C++.

Il prodotto scalare è la somma dei prodotti degli elementi corrispondenti dei due vettori. Supponiamo di avere due vettori - {1, 2, 3} e {4, 5, 6} e il prodotto scalare di questi vettori è 1*4 + 2*5 + 3*6 = 32.

Usa std::inner_product per calcolare il prodotto in punti di due vettori in C++

std::inner_product fa parte della libreria di algoritmi numerici C++ inclusa nell’intestazione <numeric>. Il metodo calcola la somma dei prodotti su due intervalli, il primo dei quali è specificato con gli iteratori begin / end e il secondo con solo begin. La funzione accetta anche init come quarto parametro per inizializzare il valore dell’accumulatore. Il valore restituito è il valore finale del prodotto di punti degli intervalli specificati. Nota che std::inner_product esegue sempre le operazioni in un dato ordine.

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

Produzione:

1; 2; 3; 4; 5;
2; 4; 6; 8; 10;
Scalar product is: 110

Usa std::transform_reduce per calcolare il prodotto in punti di due vettori in C++

A differenza del metodo precedente, std::transform_reduce può eseguire operazioni su intervalli fuori ordine, massimizzando così le prestazioni. std::transform_reduce è essenzialmente la versione parallelizzata dell’algoritmo std::inner_product. L’esempio seguente mostra l’esecuzione della funzione con gli stessi argomenti passati nell’esempio precedente.

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

Produzione:

1; 2; 3; 4; 5;
2; 4; 6; 8; 10;
Scalar product is: 110

Usa std::transform_reduce e std::execution::par Calcola il prodotto punto di due vettori

In alternativa, si può anche specificare una politica di esecuzione per l’algoritmo std::transform_reduce. Questo metodo offre un maggiore controllo al programmatore poiché il flusso del programma può essere personalizzato con regole di esecuzione definite in questo manuale. Anche se ci sono miglioramenti nelle prestazioni nell’utilizzo di transform_reduce, si dovrebbe sempre tenere conto delle potenziali condizioni di competizione quando si specifica la politica di esecuzione parallela.

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

Produzione:

1; 2; 3; 4; 5;
2; 4; 6; 8; 10;
Scalar product is: 110
Autore: 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

Articolo correlato - C++ Vector