Calcola il prodotto in punti di due vettori in C++
-
Usa
std::inner_product
per calcolare il prodotto in punti di due vettori in C++ -
Usa
std::transform_reduce
per calcolare il prodotto in punti di due vettori in C++ -
Usa
std::transform_reduce
estd::execution::par
Calcola il prodotto punto di due vettori
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
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