Berechnen des Punktprodukts zweier Vektoren in C++

Jinku Hu 12 Oktober 2023
  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
Berechnen des Punktprodukts zweier Vektoren in C++

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

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

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

Ausgabe:

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

Verwandter Artikel - C++ Vector