In this tutorial we learn how the RVec class can be used to express easily mathematical operations involving arrays and scalars.
Author: Danilo Piparo
This notebook tutorial was automatically generated with ROOTBOOK-izer from the macro found in the ROOT repository on Wednesday, April 17, 2024 at 11:24 AM.
Operations on RVec instances are made to be fast (vectorisation is exploited)
and easy to use. RVecF, RVecD, RVecI, ..., are handy aliases for RVec
ROOT::RVecF v1{1., 2., 3.};
ROOT::RVecF v2{4., 5., 6.};
Arithmetic operations are to be intended on pairs of elements with identical index
auto v_sum = v1 + v2;
auto v_mul = v1 * v2;
Easy to inspect:
std::cout << "v1 = " << v1 << "\n"
<< "v2 = " << v2 << "\n"
<< "v1 + v2 = " << v_sum << "\n"
<< "v1 * v2 = " << v_mul << std::endl;
v1 = { 1, 2, 3 } v2 = { 4, 5, 6 } v1 + v2 = { 5, 7, 9 } v1 * v2 = { 4, 10, 18 }
It's also possible to mix scalars and RVecs
auto v_diff_s_0 = v1 - 2;
auto v_diff_s_1 = 2 - v1;
auto v_div_s_0 = v1 / 2.;
auto v_div_s_1 = 2. / v1;
std::cout << v1 << " - 2 = " << v_diff_s_0 << "\n"
<< "2 - " << v1 << " = " << v_diff_s_1 << "\n"
<< v1 << " / 2 = " << v_div_s_0 << "\n"
<< "2 / " << v1 << " = " << v_div_s_1 << std::endl;
{ 1, 2, 3 } - 2 = { -1, 0, 1 } 2 - { 1, 2, 3 } = { 1, 0, -1 } { 1, 2, 3 } / 2 = { 0.5, 1, 1.5 } 2 / { 1, 2, 3 } = { 2, 1, 0.666667 }
Dot product and the extraction of quantities such as Mean, Min and Max are also easy to express (see here for the full list: https://root.cern/doc/master/namespaceROOT_1_1VecOps.html)
auto v1_mean = Mean(v1);
auto v1_dot_v2 = Dot(v1, v2);
std::cout << "Mean of " << v1 << " is " << v1_mean << "\n"
<< "Dot product of " << v1 << " and " << v2 << " is " << v1_dot_v2 << std::endl;
input_line_55:2:2: error: Syntax error auto v1_mean = Mean(v1); ^ FunctionDecl 0x7f9469625dc0 <input_line_55:1:1, line:8:1> line:1:6 __cling_Un1Qu323 'void (void *)' |-ParmVarDecl 0x7f9469625d08 <col:23, col:29> col:29 vpClingValue 'void *' |-CompoundStmt 0x7f9469630358 <col:43, line:8:1> | |-DeclStmt 0x7f94696261b8 <line:2:2, col:25> | | `-VarDecl 0x7f9469625ed8 <col:2, col:24> col:7 used v1_mean 'auto' cinit | | `-CallExpr 0x7f9469626190 <col:17, col:24> '<dependent type>' | | |-DeclRefExpr 0x7f9469626130 <col:17> '<dependent type>' lvalue Var 0x7f9469626058 'Mean' '<dependent type>' | | `-DeclRefExpr 0x7f9469626170 <col:22> 'ROOT::RVecF':'ROOT::VecOps::RVec<float>' lvalue Var 0x8621030 'v1' 'ROOT::RVecF':'ROOT::VecOps::RVec<float>' | |-DeclStmt 0x7f94696276c0 <line:3:1, col:29> | | `-VarDecl 0x7f9469626218 <col:1, col:28> col:6 used v1_dot_v2 'decltype(v0[0] * v1[0])':'float' cinit | | `-CallExpr 0x7f9469627550 <col:18, col:28> 'decltype(v0[0] * v1[0])':'float' adl | | |-ImplicitCastExpr 0x7f9469627538 <col:18> 'auto (*)(const RVec<float> &, const RVec<float> &) -> decltype(v0[0] * v1[0])' <FunctionToPointerDecay> | | | `-DeclRefExpr 0x7f9469627498 <col:18> 'auto (const RVec<float> &, const RVec<float> &) -> decltype(v0[0] * v1[0])' lvalue Function 0x7f9469627370 'Dot' 'auto (const RVec<float> &, const RVec<float> &) -> decltype(v0[0] * v1[0])' (FunctionTemplate 0x7f9469626408 'Dot') | | |-ImplicitCastExpr 0x7f9469627580 <col:22> 'const RVec<float>':'const ROOT::VecOps::RVec<float>' lvalue <NoOp> | | | `-DeclRefExpr 0x7f94696262d0 <col:22> 'ROOT::RVecF':'ROOT::VecOps::RVec<float>' lvalue Var 0x8621030 'v1' 'ROOT::RVecF':'ROOT::VecOps::RVec<float>' | | `-ImplicitCastExpr 0x7f9469627598 <col:26> 'const RVec<float>':'const ROOT::VecOps::RVec<float>' lvalue <NoOp> | | `-DeclRefExpr 0x7f94696262f0 <col:26> 'ROOT::RVecF':'ROOT::VecOps::RVec<float>' lvalue Var 0x862db08 'v2' 'ROOT::RVecF':'ROOT::VecOps::RVec<float>' | |-CXXOperatorCallExpr 0x7f9469630318 <line:5:1, line:6:86> '<dependent type>' '<<' | | |-UnresolvedLookupExpr 0x7f946962ffd8 <col:78> '<overloaded function type>' lvalue (ADL) = 'operator<<' 0x5ba2fd8 0x463c598 0x463bef8 0x5ba0598 0x5ba0820 0x5ba0ab0 0x5ba0d40 0x5ba0fd0 0x5ba1260 0x5ba14f0 0x5ba1780 0x5ba1a10 0x5ba1ca0 0x5ba1f30 0x5ba21c0 0x5ba2450 0x5ba26e0 0x5ba29a8 0x5ba64c8 0x5ba8b38 0x5bafdd8 0x5bb0cc8 0x5bbe188 0x5bbe4a8 0x5bc88f8 0x5bc99f8 0x5bcad38 0x5bcc108 0x5bcd448 0x5bce788 0x5bd0830 0x5e17e88 0x5e19868 0x5ff4328 0x4b94c70 0x4bae088 0x4fdddd8 0x5087b90 0x50d1828 0x50d1ec8 0x50d2568 0x50d2bf8 0x50d3200 0x50d3810 0x50daa80 0x50d4590 0x50d4ba0 0x50d51e0 0x50d9668 0x5128500 0x4dcfb80 0x524cb48 0x52f0ce8 0x534b6c8 0x534c768 0x534d7e8 0x534ed58 0x534fe68 0x5350ee8 0x5352e00 0x5353ee0 0x54478d8 0x547d128 0x5453f68 0x5454ec8 0x5455e28 0x54571b8 0x54a0388 0x54578a8 0x54b61a8 0x5458808 0x5459768 0x545a6c8 0x5461938 0x5486d98 0x54893c0 0x548ba98 0x5496888 0x5499558 0x549cd48 0x54a9ea8 0x54aca00 0x54b0d28 0x54b36e8 0x54c32b8 0x54c8028 0x54cccc8 0x5913000 0x564a088 0x564ad20 0x564b788 0x564c1e8 0x564ccd8 0x56fee50 0x56ff8b0 0x57002b0 | | |-CXXOperatorCallExpr 0x7f946962ff38 <line:5:1, line:6:68> '<dependent type>' '<<' | | | |-UnresolvedLookupExpr 0x7f946962fbf8 <col:65> '<overloaded function type>' lvalue (ADL) = 'operator<<' 0x5ba2fd8 0x463c598 0x463bef8 0x5ba0598 0x5ba0820 0x5ba0ab0 0x5ba0d40 0x5ba0fd0 0x5ba1260 0x5ba14f0 0x5ba1780 0x5ba1a10 0x5ba1ca0 0x5ba1f30 0x5ba21c0 0x5ba2450 0x5ba26e0 0x5ba29a8 0x5ba64c8 0x5ba8b38 0x5bafdd8 0x5bb0cc8 0x5bbe188 0x5bbe4a8 0x5bc88f8 0x5bc99f8 0x5bcad38 0x5bcc108 0x5bcd448 0x5bce788 0x5bd0830 0x5e17e88 0x5e19868 0x5ff4328 0x4b94c70 0x4bae088 0x4fdddd8 0x5087b90 0x50d1828 0x50d1ec8 0x50d2568 0x50d2bf8 0x50d3200 0x50d3810 0x50daa80 0x50d4590 0x50d4ba0 0x50d51e0 0x50d9668 0x5128500 0x4dcfb80 0x524cb48 0x52f0ce8 0x534b6c8 0x534c768 0x534d7e8 0x534ed58 0x534fe68 0x5350ee8 0x5352e00 0x5353ee0 0x54478d8 0x547d128 0x5453f68 0x5454ec8 0x5455e28 0x54571b8 0x54a0388 0x54578a8 0x54b61a8 0x5458808 0x5459768 0x545a6c8 0x5461938 0x5486d98 0x54893c0 0x548ba98 0x5496888 0x5499558 0x549cd48 0x54a9ea8 0x54aca00 0x54b0d28 0x54b36e8 0x54c32b8 0x54c8028 0x54cccc8 0x5913000 0x564a088 0x564ad20 0x564b788 0x564c1e8 0x564ccd8 0x56fee50 0x56ff8b0 0x57002b0 | | | |-CXXOperatorCallExpr 0x7f946962fba0 <line:5:1, line:6:58> '<dependent type>' '<<' | | | | |-UnresolvedLookupExpr 0x7f946962f860 <col:55> '<overloaded function type>' lvalue (ADL) = 'operator<<' 0x5ba2fd8 0x463c598 0x463bef8 0x5ba0598 0x5ba0820 0x5ba0ab0 0x5ba0d40 0x5ba0fd0 0x5ba1260 0x5ba14f0 0x5ba1780 0x5ba1a10 0x5ba1ca0 0x5ba1f30 0x5ba21c0 0x5ba2450 0x5ba26e0 0x5ba29a8 0x5ba64c8 0x5ba8b38 0x5bafdd8 0x5bb0cc8 0x5bbe188 0x5bbe4a8 0x5bc88f8 0x5bc99f8 0x5bcad38 0x5bcc108 0x5bcd448 0x5bce788 0x5bd0830 0x5e17e88 0x5e19868 0x5ff4328 0x4b94c70 0x4bae088 0x4fdddd8 0x5087b90 0x50d1828 0x50d1ec8 0x50d2568 0x50d2bf8 0x50d3200 0x50d3810 0x50daa80 0x50d4590 0x50d4ba0 0x50d51e0 0x50d9668 0x5128500 0x4dcfb80 0x524cb48 0x52f0ce8 0x534b6c8 0x534c768 0x534d7e8 0x534ed58 0x534fe68 0x5350ee8 0x5352e00 0x5353ee0 0x54478d8 0x547d128 0x5453f68 0x5454ec8 0x5455e28 0x54571b8 0x54a0388 0x54578a8 0x54b61a8 0x5458808 0x5459768 0x545a6c8 0x5461938 0x5486d98 0x54893c0 0x548ba98 0x5496888 0x5499558 0x549cd48 0x54a9ea8 0x54aca00 0x54b0d28 0x54b36e8 0x54c32b8 0x54c8028 0x54cccc8 0x5913000 0x564a088 0x564ad20 0x564b788 0x564c1e8 0x564ccd8 0x56fee50 0x56ff8b0 0x57002b0 | | | | |-CXXOperatorCallExpr 0x7f946962f808 <line:5:1, line:6:52> '<dependent type>' '<<' | | | | | |-UnresolvedLookupExpr 0x7f946962f4c8 <col:49> '<overloaded function type>' lvalue (ADL) = 'operator<<' 0x5ba2fd8 0x463c598 0x463bef8 0x5ba0598 0x5ba0820 0x5ba0ab0 0x5ba0d40 0x5ba0fd0 0x5ba1260 0x5ba14f0 0x5ba1780 0x5ba1a10 0x5ba1ca0 0x5ba1f30 0x5ba21c0 0x5ba2450 0x5ba26e0 0x5ba29a8 0x5ba64c8 0x5ba8b38 0x5bafdd8 0x5bb0cc8 0x5bbe188 0x5bbe4a8 0x5bc88f8 0x5bc99f8 0x5bcad38 0x5bcc108 0x5bcd448 0x5bce788 0x5bd0830 0x5e17e88 0x5e19868 0x5ff4328 0x4b94c70 0x4bae088 0x4fdddd8 0x5087b90 0x50d1828 0x50d1ec8 0x50d2568 0x50d2bf8 0x50d3200 0x50d3810 0x50daa80 0x50d4590 0x50d4ba0 0x50d51e0 0x50d9668 0x5128500 0x4dcfb80 0x524cb48 0x52f0ce8 0x534b6c8 0x534c768 0x534d7e8 0x534ed58 0x534fe68 0x5350ee8 0x5352e00 0x5353ee0 0x54478d8 0x547d128 0x5453f68 0x5454ec8 0x5455e28 0x54571b8 0x54a0388 0x54578a8 0x54b61a8 0x5458808 0x5459768 0x545a6c8 0x5461938 0x5486d98 0x54893c0 0x548ba98 0x5496888 0x5499558 0x549cd48 0x54a9ea8 0x54aca00 0x54b0d28 0x54b36e8 0x54c32b8 0x54c8028 0x54cccc8 0x5913000 0x564a088 0x564ad20 0x564b788 0x564c1e8 0x564ccd8 0x56fee50 0x56ff8b0 0x57002b0 | | | | | |-CXXOperatorCallExpr 0x7f946962f470 <line:5:1, line:6:41> '<dependent type>' '<<' | | | | | | |-UnresolvedLookupExpr 0x7f946962f130 <col:38> '<overloaded function type>' lvalue (ADL) = 'operator<<' 0x5ba2fd8 0x463c598 0x463bef8 0x5ba0598 0x5ba0820 0x5ba0ab0 0x5ba0d40 0x5ba0fd0 0x5ba1260 0x5ba14f0 0x5ba1780 0x5ba1a10 0x5ba1ca0 0x5ba1f30 0x5ba21c0 0x5ba2450 0x5ba26e0 0x5ba29a8 0x5ba64c8 0x5ba8b38 0x5bafdd8 0x5bb0cc8 0x5bbe188 0x5bbe4a8 0x5bc88f8 0x5bc99f8 0x5bcad38 0x5bcc108 0x5bcd448 0x5bce788 0x5bd0830 0x5e17e88 0x5e19868 0x5ff4328 0x4b94c70 0x4bae088 0x4fdddd8 0x5087b90 0x50d1828 0x50d1ec8 0x50d2568 0x50d2bf8 0x50d3200 0x50d3810 0x50daa80 0x50d4590 0x50d4ba0 0x50d51e0 0x50d9668 0x5128500 0x4dcfb80 0x524cb48 0x52f0ce8 0x534b6c8 0x534c768 0x534d7e8 0x534ed58 0x534fe68 0x5350ee8 0x5352e00 0x5353ee0 0x54478d8 0x547d128 0x5453f68 0x5454ec8 0x5455e28 0x54571b8 0x54a0388 0x54578a8 0x54b61a8 0x5458808 0x5459768 0x545a6c8 0x5461938 0x5486d98 0x54893c0 0x548ba98 0x5496888 0x5499558 0x549cd48 0x54a9ea8 0x54aca00 0x54b0d28 0x54b36e8 0x54c32b8 0x54c8028 0x54cccc8 0x5913000 0x564a088 0x564ad20 0x564b788 0x564c1e8 0x564ccd8 0x56fee50 0x56ff8b0 0x57002b0 | | | | | | |-CXXOperatorCallExpr 0x7f946962f0d8 <line:5:1, line:6:35> '<dependent type>' '<<' | | | | | | | |-UnresolvedLookupExpr 0x7f946962ed98 <col:32> '<overloaded function type>' lvalue (ADL) = 'operator<<' 0x5ba2fd8 0x463c598 0x463bef8 0x5ba0598 0x5ba0820 0x5ba0ab0 0x5ba0d40 0x5ba0fd0 0x5ba1260 0x5ba14f0 0x5ba1780 0x5ba1a10 0x5ba1ca0 0x5ba1f30 0x5ba21c0 0x5ba2450 0x5ba26e0 0x5ba29a8 0x5ba64c8 0x5ba8b38 0x5bafdd8 0x5bb0cc8 0x5bbe188 0x5bbe4a8 0x5bc88f8 0x5bc99f8 0x5bcad38 0x5bcc108 0x5bcd448 0x5bce788 0x5bd0830 0x5e17e88 0x5e19868 0x5ff4328 0x4b94c70 0x4bae088 0x4fdddd8 0x5087b90 0x50d1828 0x50d1ec8 0x50d2568 0x50d2bf8 0x50d3200 0x50d3810 0x50daa80 0x50d4590 0x50d4ba0 0x50d51e0 0x50d9668 0x5128500 0x4dcfb80 0x524cb48 0x52f0ce8 0x534b6c8 0x534c768 0x534d7e8 0x534ed58 0x534fe68 0x5350ee8 0x5352e00 0x5353ee0 0x54478d8 0x547d128 0x5453f68 0x5454ec8 0x5455e28 0x54571b8 0x54a0388 0x54578a8 0x54b61a8 0x5458808 0x5459768 0x545a6c8 0x5461938 0x5486d98 0x54893c0 0x548ba98 0x5496888 0x5499558 0x549cd48 0x54a9ea8 0x54aca00 0x54b0d28 0x54b36e8 0x54c32b8 0x54c8028 0x54cccc8 0x5913000 0x564a088 0x564ad20 0x564b788 0x564c1e8 0x564ccd8 0x56fee50 0x56ff8b0 0x57002b0 | | | | | | | |-CXXOperatorCallExpr 0x7f946962ed40 <line:5:1, line:6:14> '<dependent type>' '<<' | | | | | | | | |-UnresolvedLookupExpr 0x7f946962ea00 <col:11> '<overloaded function type>' lvalue (ADL) = 'operator<<' 0x5ba2fd8 0x463c598 0x463bef8 0x5ba0598 0x5ba0820 0x5ba0ab0 0x5ba0d40 0x5ba0fd0 0x5ba1260 0x5ba14f0 0x5ba1780 0x5ba1a10 0x5ba1ca0 0x5ba1f30 0x5ba21c0 0x5ba2450 0x5ba26e0 0x5ba29a8 0x5ba64c8 0x5ba8b38 0x5bafdd8 0x5bb0cc8 0x5bbe188 0x5bbe4a8 0x5bc88f8 0x5bc99f8 0x5bcad38 0x5bcc108 0x5bcd448 0x5bce788 0x5bd0830 0x5e17e88 0x5e19868 0x5ff4328 0x4b94c70 0x4bae088 0x4fdddd8 0x5087b90 0x50d1828 0x50d1ec8 0x50d2568 0x50d2bf8 0x50d3200 0x50d3810 0x50daa80 0x50d4590 0x50d4ba0 0x50d51e0 0x50d9668 0x5128500 0x4dcfb80 0x524cb48 0x52f0ce8 0x534b6c8 0x534c768 0x534d7e8 0x534ed58 0x534fe68 0x5350ee8 0x5352e00 0x5353ee0 0x54478d8 0x547d128 0x5453f68 0x5454ec8 0x5455e28 0x54571b8 0x54a0388 0x54578a8 0x54b61a8 0x5458808 0x5459768 0x545a6c8 0x5461938 0x5486d98 0x54893c0 0x548ba98 0x5496888 0x5499558 0x549cd48 0x54a9ea8 0x54aca00 0x54b0d28 0x54b36e8 0x54c32b8 0x54c8028 0x54cccc8 0x5913000 0x564a088 0x564ad20 0x564b788 0x564c1e8 0x564ccd8 0x56fee50 0x56ff8b0 0x57002b0 | | | | | | | | |-CXXOperatorCallExpr 0x7f946962e968 <line:5:1, col:55> '<dependent type>' '<<' | | | | | | | | | |-UnresolvedLookupExpr 0x7f946962e628 <col:52> '<overloaded function type>' lvalue (ADL) = 'operator<<' 0x5ba2fd8 0x463c598 0x463bef8 0x5ba0598 0x5ba0820 0x5ba0ab0 0x5ba0d40 0x5ba0fd0 0x5ba1260 0x5ba14f0 0x5ba1780 0x5ba1a10 0x5ba1ca0 0x5ba1f30 0x5ba21c0 0x5ba2450 0x5ba26e0 0x5ba29a8 0x5ba64c8 0x5ba8b38 0x5bafdd8 0x5bb0cc8 0x5bbe188 0x5bbe4a8 0x5bc88f8 0x5bc99f8 0x5bcad38 0x5bcc108 0x5bcd448 0x5bce788 0x5bd0830 0x5e17e88 0x5e19868 0x5ff4328 0x4b94c70 0x4bae088 0x4fdddd8 0x5087b90 0x50d1828 0x50d1ec8 0x50d2568 0x50d2bf8 0x50d3200 0x50d3810 0x50daa80 0x50d4590 0x50d4ba0 0x50d51e0 0x50d9668 0x5128500 0x4dcfb80 0x524cb48 0x52f0ce8 0x534b6c8 0x534c768 0x534d7e8 0x534ed58 0x534fe68 0x5350ee8 0x5352e00 0x5353ee0 0x54478d8 0x547d128 0x5453f68 0x5454ec8 0x5455e28 0x54571b8 0x54a0388 0x54578a8 0x54b61a8 0x5458808 0x5459768 0x545a6c8 0x5461938 0x5486d98 0x54893c0 0x548ba98 0x5496888 0x5499558 0x549cd48 0x54a9ea8 0x54aca00 0x54b0d28 0x54b36e8 0x54c32b8 0x54c8028 0x54cccc8 0x5913000 0x564a088 0x564ad20 0x564b788 0x564c1e8 0x564ccd8 0x56fee50 0x56ff8b0 0x57002b0 | | | | | | | | | |-CXXOperatorCallExpr 0x7f946962e5d0 <col:1, col:44> '<dependent type>' '<<' | | | | | | | | | | |-UnresolvedLookupExpr 0x7f946962e290 <col:41> '<overloaded function type>' lvalue (ADL) = 'operator<<' 0x5ba2fd8 0x463c598 0x463bef8 0x5ba0598 0x5ba0820 0x5ba0ab0 0x5ba0d40 0x5ba0fd0 0x5ba1260 0x5ba14f0 0x5ba1780 0x5ba1a10 0x5ba1ca0 0x5ba1f30 0x5ba21c0 0x5ba2450 0x5ba26e0 0x5ba29a8 0x5ba64c8 0x5ba8b38 0x5bafdd8 0x5bb0cc8 0x5bbe188 0x5bbe4a8 0x5bc88f8 0x5bc99f8 0x5bcad38 0x5bcc108 0x5bcd448 0x5bce788 0x5bd0830 0x5e17e88 0x5e19868 0x5ff4328 0x4b94c70 0x4bae088 0x4fdddd8 0x5087b90 0x50d1828 0x50d1ec8 0x50d2568 0x50d2bf8 0x50d3200 0x50d3810 0x50daa80 0x50d4590 0x50d4ba0 0x50d51e0 0x50d9668 0x5128500 0x4dcfb80 0x524cb48 0x52f0ce8 0x534b6c8 0x534c768 0x534d7e8 0x534ed58 0x534fe68 0x5350ee8 0x5352e00 0x5353ee0 0x54478d8 0x547d128 0x5453f68 0x5454ec8 0x5455e28 0x54571b8 0x54a0388 0x54578a8 0x54b61a8 0x5458808 0x5459768 0x545a6c8 0x5461938 0x5486d98 0x54893c0 0x548ba98 0x5496888 0x5499558 0x549cd48 0x54a9ea8 0x54aca00 0x54b0d28 0x54b36e8 0x54c32b8 0x54c8028 0x54cccc8 0x5913000 0x564a088 0x564ad20 0x564b788 0x564c1e8 0x564ccd8 0x56fee50 0x56ff8b0 0x57002b0 | | | | | | | | | | |-CXXOperatorCallExpr 0x7f946962e218 <col:1, col:34> 'basic_ostream<char, char_traits<char> >':'std::basic_ostream<char>' lvalue '<<' | | | | | | | | | | | |-ImplicitCastExpr 0x7f946962e200 <col:31> 'basic_ostream<char, char_traits<char> > &(*)(basic_ostream<char, char_traits<char> > &, const char *)' <FunctionToPointerDecay> | | | | | | | | | | | | `-DeclRefExpr 0x7f946962e1e0 <col:31> 'basic_ostream<char, char_traits<char> > &(basic_ostream<char, char_traits<char> > &, const char *)' lvalue Function 0x7f9469009298 'operator<<' 'basic_ostream<char, char_traits<char> > &(basic_ostream<char, char_traits<char> > &, const char *)' | | | | | | | | | | | |-CXXOperatorCallExpr 0x7f946962c9c8 <col:1, col:28> 'std::ostream':'std::basic_ostream<char>' lvalue '<<' adl | | | | | | | | | | | | |-ImplicitCastExpr 0x7f946962c9b0 <col:25> 'std::ostream &(*)(std::ostream &, const RVec<float> &)' <FunctionToPointerDecay> | | | | | | | | | | | | | `-DeclRefExpr 0x7f946962c990 <col:25> 'std::ostream &(std::ostream &, const RVec<float> &)' lvalue Function 0x7f94694c99a8 'operator<<' 'std::ostream &(std::ostream &, const RVec<float> &)' | | | | | | | | | | | | |-CXXOperatorCallExpr 0x7f9469629fe8 <col:1, col:14> 'basic_ostream<char, char_traits<char> >':'std::basic_ostream<char>' lvalue '<<' | | | | | | | | | | | | | |-ImplicitCastExpr 0x7f9469629fd0 <col:11> 'basic_ostream<char, char_traits<char> > &(*)(basic_ostream<char, char_traits<char> > &, const char *)' <FunctionToPointerDecay> | | | | | | | | | | | | | | `-DeclRefExpr 0x7f9469629fb0 <col:11> 'basic_ostream<char, char_traits<char> > &(basic_ostream<char, char_traits<char> > &, const char *)' lvalue Function 0x7f9469009298 'operator<<' 'basic_ostream<char, char_traits<char> > &(basic_ostream<char, char_traits<char> > &, const char *)' | | | | | | | | | | | | | |-DeclRefExpr 0x7f9469627728 <col:1, col:6> 'ostream':'std::basic_ostream<char>' lvalue Var 0x536c488 'cout' 'ostream':'std::basic_ostream<char>' | | | | | | | | | | | | | `-ImplicitCastExpr 0x7f9469629f98 <col:14> 'const char *' <ArrayToPointerDecay> | | | | | | | | | | | | | `-StringLiteral 0x7f94696277d8 <col:14> 'const char[9]' lvalue "Mean of " | | | | | | | | | | | | `-ImplicitCastExpr 0x7f946962c978 <col:28> 'const RVec<float>':'const ROOT::VecOps::RVec<float>' lvalue <NoOp> | | | | | | | | | | | | `-DeclRefExpr 0x7f946962a020 <col:28> 'ROOT::RVecF':'ROOT::VecOps::RVec<float>' lvalue Var 0x8621030 'v1' 'ROOT::RVecF':'ROOT::VecOps::RVec<float>' | | | | | | | | | | | `-ImplicitCastExpr 0x7f946962e1c8 <col:34> 'const char *' <ArrayToPointerDecay> | | | | | | | | | | | `-StringLiteral 0x7f946962ca00 <col:34> 'const char[5]' lvalue " is " | | | | | | | | | | `-DeclRefExpr 0x7f946962e250 <col:44> 'auto' lvalue Var 0x7f9469625ed8 'v1_mean' 'auto' | | | | | | | | | `-StringLiteral 0x7f946962e608 <col:55> 'const char[2]' lvalue "\n" | | | | | | | | `-StringLiteral 0x7f946962e9d8 <line:6:14> 'const char[16]' lvalue "Dot product of " | | | | | | | `-DeclRefExpr 0x7f946962ed78 <col:35> 'ROOT::RVecF':'ROOT::VecOps::RVec<float>' lvalue Var 0x8621030 'v1' 'ROOT::RVecF':'ROOT::VecOps::RVec<float>' | | | | | | `-StringLiteral 0x7f946962f110 <col:41> 'const char[6]' lvalue " and " | | | | | `-DeclRefExpr 0x7f946962f4a8 <col:52> 'ROOT::RVecF':'ROOT::VecOps::RVec<float>' lvalue Var 0x862db08 'v2' 'ROOT::RVecF':'ROOT::VecOps::RVec<float>' | | | | `-StringLiteral 0x7f946962f840 <col:58> 'const char[5]' lvalue " is " | | | `-DeclRefExpr 0x7f946962fbd8 <col:68> 'decltype(v0[0] * v1[0])':'float' lvalue Var 0x7f9469626218 'v1_dot_v2' 'decltype(v0[0] * v1[0])':'float' | | `-UnresolvedLookupExpr 0x7f946962ff90 <col:81, col:86> '<overloaded function type>' lvalue (no ADL) = 'endl' 0x50d5820 | `-NullStmt 0x7f9469630350 <line:7:1> |-AnnotateAttr 0x7f9469625fb0 <<invalid sloc>> Implicit R"ATTRDUMP(__ResolveAtRuntime)ATTRDUMP" `-AnnotateAttr 0x7f94696260c0 <<invalid sloc>> Implicit R"ATTRDUMP(__ResolveAtRuntime)ATTRDUMP" <<<NULL>>>
Most used mathematical functions are supported
auto v_exp = exp(v1);
auto v_log = log(v1);
auto v_sin = sin(v1);
std::cout << "exp(" << v1 << ") = " << v_exp << "\n"
<< "log(" << v1 << ") = " << v_log << "\n"
<< "sin(" << v1 << ") = " << v_sin << std::endl;
exp({ 1, 2, 3 }) = { 2.71828, 7.38906, 20.0855 } log({ 1, 2, 3 }) = { 0, 0.693147, 1.09861 } sin({ 1, 2, 3 }) = { 0.841471, 0.909297, 0.14112 }
Even an optimised version of the functions is available provided that VDT is not disabled during the configuration
#ifdef R__HAS_VDT
auto v_fast_exp = fast_exp(v1);
auto v_fast_log = fast_log(v1);
auto v_fast_sin = fast_sin(v1);
std::cout << "fast_exp(" << v1 << ") = " << v_fast_exp << "\n"
<< "fast_log(" << v1 << ") = " << v_fast_log << "\n"
<< "fast_sin(" << v1 << ") = " << v_fast_sin << std::endl;
Unbalanced braces. This cell was not processed.
It may happen that a custom operation needs to be applied to the RVec. In this case, the Map utility can be used:
auto v_transf = Map(v1, [](double x) { return x * 2 / 3; });
std::cout << "Applying [](double x){return x * 2 / 3;} to " << v1 << " leads to " << v_transf << "\n";
#endif
input_line_58:5:2: error: #endif without #if #endif ^ input_line_58:2:2: error: Syntax error auto v_transf = Map(v1, [](double x) { return x * 2 / 3; }); ^ FunctionDecl 0x7f946a6bb9f8 <input_line_58:1:1, line:7:1> line:1:6 __cling_Un1Qu326 'void (void *)' |-ParmVarDecl 0x7f946a6bb940 <col:23, col:29> col:29 vpClingValue 'void *' |-CompoundStmt 0x7f946a6c3c18 <col:43, line:7:1> | |-DeclStmt 0x7f946a6bc900 <line:2:2, col:61> | | `-VarDecl 0x7f946a6bbb10 <col:2, col:60> col:7 used v_transf 'auto' cinit | | `-CallExpr 0x7f946a6bc8d0 <col:18, col:60> '<dependent type>' | | |-DeclRefExpr 0x7f946a6bbd60 <col:18> '<dependent type>' lvalue Var 0x7f946a6bbc88 'Map' '<dependent type>' | | |-DeclRefExpr 0x7f946a6bbda0 <col:22> 'ROOT::RVecF':'ROOT::VecOps::RVec<float>' lvalue Var 0x8621030 'v1' 'ROOT::RVecF':'ROOT::VecOps::RVec<float>' | | `-LambdaExpr 0x7f946a6bc798 <col:26, col:59> '(lambda at input_line_58:2:26)' | | |-CXXRecordDecl 0x7f946a6bbf00 <col:26> col:26 implicit class definition | | | |-DefinitionData lambda pass_in_registers empty standard_layout trivially_copyable literal can_const_default_init | | | | |-DefaultConstructor defaulted_is_constexpr | | | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param | | | | |-MoveConstructor exists simple trivial needs_implicit | | | | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param | | | | |-MoveAssignment | | | | `-Destructor simple irrelevant trivial | | | |-CXXMethodDecl 0x7f946a6bc068 <col:37, col:59> col:26 constexpr operator() 'double (double) const' inline | | | | |-ParmVarDecl 0x7f946a6bbde0 <col:29, col:36> col:36 used x 'double' | | | | `-CompoundStmt 0x7f946a6bc390 <col:39, col:59> | | | | `-ReturnStmt 0x7f946a6bc380 <col:41, col:56> | | | | `-BinaryOperator 0x7f946a6bc1f0 <col:48, col:56> 'double' '/' | | | | |-BinaryOperator 0x7f946a6bc198 <col:48, col:52> 'double' '*' | | | | | |-ImplicitCastExpr 0x7f946a6bc168 <col:48> 'double' <LValueToRValue> | | | | | | `-DeclRefExpr 0x7f946a6bc128 <col:48> 'double' lvalue ParmVar 0x7f946a6bbde0 'x' 'double' | | | | | `-ImplicitCastExpr 0x7f946a6bc180 <col:52> 'double' <IntegralToFloating> | | | | | `-IntegerLiteral 0x7f946a6bc148 <col:52> 'int' 2 | | | | `-ImplicitCastExpr 0x7f946a6bc1d8 <col:56> 'double' <IntegralToFloating> | | | | `-IntegerLiteral 0x7f946a6bc1b8 <col:56> 'int' 3 | | | |-CXXConversionDecl 0x7f946a6bc5d0 <col:26, col:59> col:26 implicit constexpr operator double (*)(double) 'double (*() const noexcept)(double)' inline | | | |-CXXMethodDecl 0x7f946a6bc690 <col:26, col:59> col:26 implicit __invoke 'double (double)' static inline | | | | `-ParmVarDecl 0x7f946a6bc560 <col:29, col:36> col:36 x 'double' | | | `-CXXDestructorDecl 0x7f946a6bc7c8 <col:26> col:26 implicit referenced ~(lambda at input_line_58:2:26) 'void () noexcept' inline default trivial | | `-CompoundStmt 0x7f946a6bc390 <col:39, col:59> | | `-ReturnStmt 0x7f946a6bc380 <col:41, col:56> | | `-BinaryOperator 0x7f946a6bc1f0 <col:48, col:56> 'double' '/' | | |-BinaryOperator 0x7f946a6bc198 <col:48, col:52> 'double' '*' | | | |-ImplicitCastExpr 0x7f946a6bc168 <col:48> 'double' <LValueToRValue> | | | | `-DeclRefExpr 0x7f946a6bc128 <col:48> 'double' lvalue ParmVar 0x7f946a6bbde0 'x' 'double' | | | `-ImplicitCastExpr 0x7f946a6bc180 <col:52> 'double' <IntegralToFloating> | | | `-IntegerLiteral 0x7f946a6bc148 <col:52> 'int' 2 | | `-ImplicitCastExpr 0x7f946a6bc1d8 <col:56> 'double' <IntegralToFloating> | | `-IntegerLiteral 0x7f946a6bc1b8 <col:56> 'int' 3 | |-CXXOperatorCallExpr 0x7f946a6c3bd8 <line:4:1, col:98> '<dependent type>' '<<' | | |-UnresolvedLookupExpr 0x7f946a6c3898 <col:95> '<overloaded function type>' lvalue (ADL) = 'operator<<' 0x5ba2fd8 0x463c598 0x463bef8 0x5ba0598 0x5ba0820 0x5ba0ab0 0x5ba0d40 0x5ba0fd0 0x5ba1260 0x5ba14f0 0x5ba1780 0x5ba1a10 0x5ba1ca0 0x5ba1f30 0x5ba21c0 0x5ba2450 0x5ba26e0 0x5ba29a8 0x5ba64c8 0x5ba8b38 0x5bafdd8 0x5bb0cc8 0x5bbe188 0x5bbe4a8 0x5bc88f8 0x5bc99f8 0x5bcad38 0x5bcc108 0x5bcd448 0x5bce788 0x5bd0830 0x5e17e88 0x5e19868 0x5ff4328 0x4b94c70 0x4bae088 0x4fdddd8 0x5087b90 0x50d1828 0x50d1ec8 0x50d2568 0x50d2bf8 0x50d3200 0x50d3810 0x50daa80 0x50d4590 0x50d4ba0 0x50d51e0 0x50d9668 0x5128500 0x4dcfb80 0x524cb48 0x52f0ce8 0x534b6c8 0x534c768 0x534d7e8 0x534ed58 0x534fe68 0x5350ee8 0x5352e00 0x5353ee0 0x54478d8 0x547d128 0x5453f68 0x5454ec8 0x5455e28 0x54571b8 0x54a0388 0x54578a8 0x54b61a8 0x5458808 0x5459768 0x545a6c8 0x5461938 0x5486d98 0x54893c0 0x548ba98 0x5496888 0x5499558 0x549cd48 0x54a9ea8 0x54aca00 0x54b0d28 0x54b36e8 0x54c32b8 0x54c8028 0x54cccc8 0x5913000 0x564a088 0x564ad20 0x564b788 0x564c1e8 0x564ccd8 0x56fee50 0x56ff8b0 0x57002b0 | | |-CXXOperatorCallExpr 0x7f946a6c3840 <col:1, col:86> '<dependent type>' '<<' | | | |-UnresolvedLookupExpr 0x7f946a6c3500 <col:83> '<overloaded function type>' lvalue (ADL) = 'operator<<' 0x5ba2fd8 0x463c598 0x463bef8 0x5ba0598 0x5ba0820 0x5ba0ab0 0x5ba0d40 0x5ba0fd0 0x5ba1260 0x5ba14f0 0x5ba1780 0x5ba1a10 0x5ba1ca0 0x5ba1f30 0x5ba21c0 0x5ba2450 0x5ba26e0 0x5ba29a8 0x5ba64c8 0x5ba8b38 0x5bafdd8 0x5bb0cc8 0x5bbe188 0x5bbe4a8 0x5bc88f8 0x5bc99f8 0x5bcad38 0x5bcc108 0x5bcd448 0x5bce788 0x5bd0830 0x5e17e88 0x5e19868 0x5ff4328 0x4b94c70 0x4bae088 0x4fdddd8 0x5087b90 0x50d1828 0x50d1ec8 0x50d2568 0x50d2bf8 0x50d3200 0x50d3810 0x50daa80 0x50d4590 0x50d4ba0 0x50d51e0 0x50d9668 0x5128500 0x4dcfb80 0x524cb48 0x52f0ce8 0x534b6c8 0x534c768 0x534d7e8 0x534ed58 0x534fe68 0x5350ee8 0x5352e00 0x5353ee0 0x54478d8 0x547d128 0x5453f68 0x5454ec8 0x5455e28 0x54571b8 0x54a0388 0x54578a8 0x54b61a8 0x5458808 0x5459768 0x545a6c8 0x5461938 0x5486d98 0x54893c0 0x548ba98 0x5496888 0x5499558 0x549cd48 0x54a9ea8 0x54aca00 0x54b0d28 0x54b36e8 0x54c32b8 0x54c8028 0x54cccc8 0x5913000 0x564a088 0x564ad20 0x564b788 0x564c1e8 0x564ccd8 0x56fee50 0x56ff8b0 0x57002b0 | | | |-CXXOperatorCallExpr 0x7f946a6c3488 <col:1, col:70> 'basic_ostream<char, char_traits<char> >':'std::basic_ostream<char>' lvalue '<<' | | | | |-ImplicitCastExpr 0x7f946a6c3470 <col:67> 'basic_ostream<char, char_traits<char> > &(*)(basic_ostream<char, char_traits<char> > &, const char *)' <FunctionToPointerDecay> | | | | | `-DeclRefExpr 0x7f946a6c3450 <col:67> 'basic_ostream<char, char_traits<char> > &(basic_ostream<char, char_traits<char> > &, const char *)' lvalue Function 0x7f9469009298 'operator<<' 'basic_ostream<char, char_traits<char> > &(basic_ostream<char, char_traits<char> > &, const char *)' | | | | |-CXXOperatorCallExpr 0x7f946a6c1c28 <col:1, col:64> 'std::ostream':'std::basic_ostream<char>' lvalue '<<' adl | | | | | |-ImplicitCastExpr 0x7f946a6c1c10 <col:61> 'std::ostream &(*)(std::ostream &, const RVec<float> &)' <FunctionToPointerDecay> | | | | | | `-DeclRefExpr 0x7f946a6c1bf0 <col:61> 'std::ostream &(std::ostream &, const RVec<float> &)' lvalue Function 0x7f94694c99a8 'operator<<' 'std::ostream &(std::ostream &, const RVec<float> &)' | | | | | |-CXXOperatorCallExpr 0x7f946a6bf248 <col:1, col:14> 'basic_ostream<char, char_traits<char> >':'std::basic_ostream<char>' lvalue '<<' | | | | | | |-ImplicitCastExpr 0x7f946a6bf230 <col:11> 'basic_ostream<char, char_traits<char> > &(*)(basic_ostream<char, char_traits<char> > &, const char *)' <FunctionToPointerDecay> | | | | | | | `-DeclRefExpr 0x7f946a6bf210 <col:11> 'basic_ostream<char, char_traits<char> > &(basic_ostream<char, char_traits<char> > &, const char *)' lvalue Function 0x7f9469009298 'operator<<' 'basic_ostream<char, char_traits<char> > &(basic_ostream<char, char_traits<char> > &, const char *)' | | | | | | |-DeclRefExpr 0x7f946a6bc968 <col:1, col:6> 'ostream':'std::basic_ostream<char>' lvalue Var 0x536c488 'cout' 'ostream':'std::basic_ostream<char>' | | | | | | `-ImplicitCastExpr 0x7f946a6bf1f8 <col:14> 'const char *' <ArrayToPointerDecay> | | | | | | `-StringLiteral 0x7f946a6bca18 <col:14> 'const char[45]' lvalue "Applying [](double x){return x * 2 / 3;} to " | | | | | `-ImplicitCastExpr 0x7f946a6c1bd8 <col:64> 'const RVec<float>':'const ROOT::VecOps::RVec<float>' lvalue <NoOp> | | | | | `-DeclRefExpr 0x7f946a6bf280 <col:64> 'ROOT::RVecF':'ROOT::VecOps::RVec<float>' lvalue Var 0x8621030 'v1' 'ROOT::RVecF':'ROOT::VecOps::RVec<float>' | | | | `-ImplicitCastExpr 0x7f946a6c3438 <col:70> 'const char *' <ArrayToPointerDecay> | | | | `-StringLiteral 0x7f946a6c1c60 <col:70> 'const char[11]' lvalue " leads to " | | | `-DeclRefExpr 0x7f946a6c34c0 <col:86> 'auto' lvalue Var 0x7f946a6bbb10 'v_transf' 'auto' | | `-StringLiteral 0x7f946a6c3878 <col:98> 'const char[2]' lvalue "\n" | `-NullStmt 0x7f946a6c3c10 <line:6:1> |-AnnotateAttr 0x7f946a6bbbe8 <<invalid sloc>> Implicit R"ATTRDUMP(__ResolveAtRuntime)ATTRDUMP" `-AnnotateAttr 0x7f946a6bbcf0 <<invalid sloc>> Implicit R"ATTRDUMP(__ResolveAtRuntime)ATTRDUMP" <<<NULL>>>