Berechnen des Punktprodukts zweier Vektoren in C++
-
Verwenden von
std::inner_product
zum Berechnen des Punktprodukts zweier Vektoren in C++ -
Verwenden von
std::transform_reduce
zum Berechnen des Punktprodukts zweier Vektoren in C++ -
Verwendung von
std::transform_reduce
undstd::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 <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
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