 ROOT   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 // Note that you can also pass the size of the vectors directly.
24 auto idx = Combinations(v1, v2);
25
26 // Next, the respective elements can be taken via the computed indices.
27 auto c1 = Take(v1, idx);
28 auto c2 = Take(v2, idx);
29
30 // Finally, you can perform any set of operations conveniently.
31 auto v3 = c1 * c2;
32
33 std::cout << "Combinations of " << v1 << " and " << v2 << ":" << std::endl;
34 for(size_t i=0; i<v3.size(); i++) {
35 std::cout << c1[i] << " * " << c2[i] << " = " << v3[i] << std::endl;
36 }
37 std::cout << std::endl;
38
39 // However, if you want to compute operations on unique combinations of a
40 // single RVec, you can perform this as follows.
41
42 // Get the indices of unique triples for the given vector.
43 RVec<double> v4{1., 2., 3., 4.};
44 auto idx2 = Combinations(v4, 3);
45
46 // Take the elements and compute any operation on the returned collections.
47 auto c3 = Take(v4, idx2);
48 auto c4 = Take(v4, idx2);
49 auto c5 = Take(v4, idx2);
50
51 auto v5 = c3 * c4 * c5;
52
53 std::cout << "Unique triples of " << v4 << ":" << std::endl;
54 for(size_t i=0; i<v4.size(); i++) {
55 std::cout << c3[i] << " * " << c4[i] << " * " << c5[i] << " = " << v5[i] << std::endl;
56 }
57 std::cout << std::endl;
58}
return c1
Definition: legend1.C:41
return c2
Definition: legend2.C:14
return c3
Definition: legend3.C:15
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:1058
RVec< RVec< std::size_t > > Combinations(const std::size_t size1, const std::size_t size2)
Return the indices that represent all combinations of the elements of two RVecs.
Definition: RVec.hxx:1181