Berechnen des Punktprodukts zweier Vektoren in C++

  1. Verwenden von std::inner_product zum Berechnen des Punktprodukts zweier Vektoren in C++
  2. Verwenden von std::transform_reduce zum Berechnen des Punktprodukts zweier Vektoren in C++
  3. Verwendung von std::transform_reduce und std::execution::par Berechnen des Punktprodukts zweier Vektoren

In diesem Artikel werden mehrere Methoden zur Berechnung des Punktprodukts zweier Vektoren in C++ vorgestellt.

Das Punktprodukt ist die Summe der Produkte der entsprechenden Elemente der beiden Vektoren. Angenommen, wir haben zwei Vektoren - {1, 2, 3} und {4, 5, 6}, und das Punktprodukt dieser Vektoren ist 1*4 + 2*5 + 3*6 = 32.

Verwenden von std::inner_product zum Berechnen des Punktprodukts zweier Vektoren in C++

std::inner_product ist Teil der C++-Bibliothek für numerische Algorithmen, die im Header <numeric> enthalten ist. Die Methode berechnet die Summe von Produkten über zwei Bereiche, wobei der erste Bereich mit begin/end-Iteratoren und der zweite Bereich nur mit begin angegeben wird. Die Funktion nimmt außerdem init als vierten Parameter an, um den Akkumulatorwert zu initialisieren. Der Rückgabewert ist der endgültige Punktproduktwert der angegebenen Bereiche. Beachten Sie, dass std::inner_product die Operationen immer in einer bestimmten Reihenfolge ausführt.

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

Ausgabe:

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

Verwenden von std::transform_reduce zum Berechnen des Punktprodukts zweier Vektoren in C++

Im Gegensatz zur vorherigen Methode kann std::transform_reduce Operationen auf Bereichen außerhalb der Reihenfolge durchführen und so die Leistung maximieren. std::transform_reduce ist im Wesentlichen die parallelisierte Version des Algorithmus std::inner_product. Das folgende Beispiel demonstriert die Ausführung der Funktion mit denselben Argumenten wie im vorherigen Beispiel übergeben.

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

Ausgabe:

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

Verwendung von std::transform_reduce und std::execution::par Berechnen des Punktprodukts zweier Vektoren

Alternativ kann man zusätzlich eine Ausführungsrichtlinie für den Algorithmus std::transform_reduce angeben. Diese Methode bietet dem Programmierer mehr Kontrolle, da der Programmablauf mit Ausführungsregeln, wie in diesem Handbuch definiert, angepasst werden kann. Auch wenn die Verwendung von transform_reduce zu Leistungssteigerungen führt, sollten Sie bei der Festlegung von Richtlinien für die parallele Ausführung immer auf mögliche Rennbedingungen achten.

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

Ausgabe:

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

Verwandter Artikel - C++ Vector

  • Zugriff auf Member-Funktionen vom Zeiger auf einen Vektor in C++
  • Wie man Vektor in Array in C++ konvertiert