Calculer le produit scalaire de deux vecteurs en C++
-
Utilisez
std::inner_product
pour calculer le produit scalaire de deux vecteurs en C++ -
Utilisez
std::transform_reduce
pour calculer le produit scalaire de deux vecteurs en C++ -
Utilisez
std::transform_reduce
etstd::execution::par
Calculer le produit scalaire de deux vecteurs
Cet article présentera plusieurs méthodes de calcul du produit scalaire de deux vecteurs en C++.
Le produit scalaire est la somme des produits des éléments correspondants des deux vecteurs. Supposons que nous ayons deux vecteurs - {1, 2, 3}
et {4, 5, 6}
, et que le produit scalaire de ces vecteurs soit 1*4 + 2*5 + 3*6 = 32
.
Utilisez std::inner_product
pour calculer le produit scalaire de deux vecteurs en C++
std::inner_product
fait partie de la bibliothèque d’algorithmes numériques C++ incluse dans l’en-tête <numeric>
. La méthode calcule la somme des produits sur deux plages, dont la première est spécifiée avec les itérateurs begin
et end
et la seconde avec seulement begin
. La fonction prend également init
comme quatrième paramètre pour initialiser la valeur de l’accumulateur. La valeur de retour est la valeur finale du produit des points des plages données. Notez que std::inner_product
effectue toujours les opérations dans un ordre donné.
#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;
}
Production :
1; 2; 3; 4; 5;
2; 4; 6; 8; 10;
Scalar product is: 110
Utilisez std::transform_reduce
pour calculer le produit scalaire de deux vecteurs en C++
Contrairement à la méthode précédente, std::transform_reduce
peut effectuer des opérations sur des plages en désordre, ce qui maximise les performances. std::transform_reduce
est essentiellement la version parallélisée de l’algorithme std::inner_product
. L’exemple suivant démontre l’exécution de la fonction avec les mêmes arguments que ceux passés dans l’exemple précédent.
#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;
}
Production :
1; 2; 3; 4; 5;
2; 4; 6; 8; 10;
Scalar product is: 110
Utilisez std::transform_reduce
et std::execution::par
Calculer le produit scalaire de deux vecteurs
On peut aussi spécifier une politique d’exécution pour l’algorithme std::transform_reduce
. Cette méthode offre plus de contrôle au programmeur car le déroulement du programme peut être personnalisé avec les règles d’exécution définies dans ce manuel. Même si l’utilisation de transform_reduce
permet de gagner en performance, il faut toujours garder à l’esprit les conditions de course potentielles lorsque l’on spécifie une politique d’exécution parallèle.
#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;
}
Production :
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