Calculer le produit scalaire de deux vecteurs en C++

  1. Utilisez std::inner_product pour calculer le produit scalaire de deux vecteurs en C++
  2. Utilisez std::transform_reduce pour calculer le produit scalaire de deux vecteurs en C++
  3. Utilisez std::transform_reduce et std::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 <vector>
#include <numeric>
#include <iterator>

using std::cout;
using std::endl;
using std::vector;
using std::copy;

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 <vector>
#include <numeric>
#include <iterator>

using std::cout;
using std::endl;
using std::vector;
using std::copy;
using std::inner_product;

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 <iostream>
#include <vector>
#include <numeric>
#include <iterator>
#include <execution>

using std::cout;
using std::endl;
using std::vector;
using std::copy;
using std::inner_product;

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

Article connexe - C++ Vector

  • Mélange de vecteurs en C++