Logo ROOT   6.16/01
Reference Guide
vo005_Combinations.C
Go to the documentation of this file.
1/// \file
2/// \ingroup tutorial_vecops
3/// \notebook -nodraw
4/// In this tutorial we learn how combinations of RVecs can be build.
5///
6/// \macro_code
7/// \macro_output
8///
9/// \date August 2018
10/// \author Stefan Wunsch
11
12using namespace ROOT::VecOps;
13
15{
16 // The starting point are two collections and we want to calculate the result
17 // of combinations of the elements.
18 RVec<double> v1{1., 2., 3.};
19 RVec<double> v2{-4., -5.};
20
21 // To get the indices, which result in all combinations, you can call the
22 // following helper.
23 auto idx = Combinations(v1, v2);
24
25 // Next, the respective elements can be taken via the computed indices.
26 auto c1 = Take(v1, idx[0]);
27 auto c2 = Take(v2, idx[1]);
28
29 // Finally, you can perform any set of operations conveniently.
30 auto v3 = c1 * c2;
31
32 std::cout << "Combinations of " << v1 << " and " << v2 << ":" << std::endl;
33 for(size_t i=0; i<v3.size(); i++) {
34 std::cout << c1[i] << " * " << c2[i] << " = " << v3[i] << std::endl;
35 }
36 std::cout << std::endl;
37
38 // However, if you want to compute operations on unique combinations of a
39 // single RVec, you can perform this as follows.
40
41 // Get the indices of unique triples for the given vector.
42 RVec<double> v4{1., 2., 3., 4.};
43 auto idx2 = Combinations(v4, 3);
44
45 // Take the elements and compute any operation on the returned collections.
46 auto c3 = Take(v4, idx2[0]);
47 auto c4 = Take(v4, idx2[1]);
48 auto c5 = Take(v4, idx2[2]);
49
50 auto v5 = c3 * c4 * c5;
51
52 std::cout << "Unique triples of " << v4 << ":" << std::endl;
53 for(size_t i=0; i<v4.size(); i++) {
54 std::cout << c3[i] << " * " << c4[i] << " * " << c5[i] << " = " << v5[i] << std::endl;
55 }
56 std::cout << std::endl;
57}
A "std::vector"-like collection of values implementing handy operation to analyse them.
Definition: RVec.hxx:221
return c1
Definition: legend1.C:41
return c2
Definition: legend2.C:14
return c3
Definition: legend3.C:15
RVec< RVec< typename RVec< T1 >::size_type > > Combinations(const RVec< T1 > &v1, const RVec< T2 > &v2)
Return the indices that represent all combinations of the elements of two RVecs.
Definition: RVec.hxx:1008
RVec< T > Take(const RVec< T > &v, const RVec< typename RVec< T >::size_type > &i)
Return elements of a vector at given indices.
Definition: RVec.hxx:882