Syntax:
#include <numeric> TYPE inner_product( iterator start1, iterator end1, iterator start2, TYPE val ); TYPE inner_product( iterator start1, iterator end1, iterator start2, TYPE val, BinaryFunction f1, BinaryFunction f2 );
The inner_product function computes the inner product of [start1,end1)
and a
range of the same size starting at start2
.
inner_product() runs in linear time.
For example, the following code shows how inner_product (or, alternatively, accumulate) can be used to compute the sums of squares of some data:
// Examples of std::accumulate and std::inner_product from wordaligned.org #include <functional> #include <iostream> #include <numeric> #include <string> #include <valarray> #include <vector> typedef std::valarray<double> xyz; // Xyz output operator std::ostream & operator<<(std::ostream & os, xyz const & pt) { os << '('; char const * sep = ""; for( size_t i = 0; i != pt.size(); sep = ", ", ++i ) { os << sep << pt[i]; } os << ')'; return os; } // Bitwise or function, for use in reductions unsigned bit_or(unsigned u, unsigned v) { return u | v; } // Create and return a triangle std::vector<xyz> create_triangle() { std::vector<xyz> pts; double const p[9] = {1.,1.,0.,1.,0.,1.,0.,1.,1.}; pts.push_back(xyz(p + 0, 3)); pts.push_back(xyz(p + 3, 3)); pts.push_back(xyz(p + 6, 3)); return pts; } // Set up some test arrays, accumulate them and print the results to stdout. int main() { int const a[3] = { 1, 2, 3 }; int const b[3] = { 3, 2, 1 }; std::string const s[3] = { "http://", "wordaligned", ".org" }; bool const t[3] = { false, true, false }; std::vector<xyz> tri = create_triangle(); unsigned m[3] = { 1<<1, 1<<3, 1<<5 }; std::cout << "sum(a) " << std::accumulate(a, a + 3, 0) << "\nprod(a) " << std::accumulate(a, a + 3, 1, std::multiplies<int>()) << "\nsum_sqs(a) " << std::inner_product(a, a + 3, a, 0) << "\ndot(a, b) " << std::inner_product(a, a + 3, b, 0) << "\nconcat(s) " << std::accumulate(s, s + 3, std::string("")) << "\nany(t) " << std::boolalpha << std::accumulate(t, t + 3, false, std::logical_or<bool>()) << "\ncentroid(tri) " << std::accumulate(tri.begin(), tri.end(), xyz(0., 3)) / 3. << "\nbitor(m) " << std::hex << "0x" << std::accumulate(m, m + 3, 0, bit_or) << '\n'; return 0; }
When run, this code generates the following output:
sum(a) 6 prod(a) 6 sum_sqs(a) 14 dot(a, b) 10 concat(s) http://wordaligned.org any(t) true centroid(tri) (0.666667, 0.666667, 0.666667) bitor(m) 0x2a
Related Topics: accumulate, adjacent_difference, count, partial_sum