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 Tuesday, March 19, 2024 at 07:22 PM.
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 0x7f24e9667f60 <input_line_55:1:1, line:8:1> line:1:6 __cling_Un1Qu323 'void (void *)' |-ParmVarDecl 0x7f24e9667ea8 <col:23, col:29> col:29 vpClingValue 'void *' |-CompoundStmt 0x7f24e96724f8 <col:43, line:8:1> | |-DeclStmt 0x7f24e9668358 <line:2:2, col:25> | | `-VarDecl 0x7f24e9668078 <col:2, col:24> col:7 used v1_mean 'auto' cinit | | `-CallExpr 0x7f24e9668330 <col:17, col:24> '<dependent type>' | | |-DeclRefExpr 0x7f24e96682d0 <col:17> '<dependent type>' lvalue Var 0x7f24e96681f8 'Mean' '<dependent type>' | | `-DeclRefExpr 0x7f24e9668310 <col:22> 'ROOT::RVecF':'ROOT::VecOps::RVec<float>' lvalue Var 0x8d9a2b0 'v1' 'ROOT::RVecF':'ROOT::VecOps::RVec<float>' | |-DeclStmt 0x7f24e9669860 <line:3:1, col:29> | | `-VarDecl 0x7f24e96683b8 <col:1, col:28> col:6 used v1_dot_v2 'decltype(v0[0] * v1[0])':'float' cinit | | `-CallExpr 0x7f24e96696f0 <col:18, col:28> 'decltype(v0[0] * v1[0])':'float' adl | | |-ImplicitCastExpr 0x7f24e96696d8 <col:18> 'auto (*)(const RVec<float> &, const RVec<float> &) -> decltype(v0[0] * v1[0])' <FunctionToPointerDecay> | | | `-DeclRefExpr 0x7f24e9669638 <col:18> 'auto (const RVec<float> &, const RVec<float> &) -> decltype(v0[0] * v1[0])' lvalue Function 0x7f24e9669510 'Dot' 'auto (const RVec<float> &, const RVec<float> &) -> decltype(v0[0] * v1[0])' (FunctionTemplate 0x7f24e96685a8 'Dot') | | |-ImplicitCastExpr 0x7f24e9669720 <col:22> 'const RVec<float>':'const ROOT::VecOps::RVec<float>' lvalue <NoOp> | | | `-DeclRefExpr 0x7f24e9668470 <col:22> 'ROOT::RVecF':'ROOT::VecOps::RVec<float>' lvalue Var 0x8d9a2b0 'v1' 'ROOT::RVecF':'ROOT::VecOps::RVec<float>' | | `-ImplicitCastExpr 0x7f24e9669738 <col:26> 'const RVec<float>':'const ROOT::VecOps::RVec<float>' lvalue <NoOp> | | `-DeclRefExpr 0x7f24e9668490 <col:26> 'ROOT::RVecF':'ROOT::VecOps::RVec<float>' lvalue Var 0x8da6d88 'v2' 'ROOT::RVecF':'ROOT::VecOps::RVec<float>' | |-CXXOperatorCallExpr 0x7f24e96724b8 <line:5:1, line:6:86> '<dependent type>' '<<' | | |-UnresolvedLookupExpr 0x7f24e9672178 <col:78> '<overloaded function type>' lvalue (ADL) = 'operator<<' 0x4da1308 0x4d51d48 0x4d516a8 0x4d9e8c8 0x4d9eb50 0x4d9ede0 0x4d9f070 0x4d9f300 0x4d9f590 0x4d9f820 0x4d9fab0 0x4d9fd40 0x4d9ffd0 0x4da0260 0x4da04f0 0x4da0780 0x4da0a10 0x4da0cd8 0x628f058 0x62916c8 0x6298968 0x6299858 0x62a6cd8 0x62a6ff8 0x62b9488 0x62ba588 0x62bb8c8 0x62bcc98 0x62bdfd8 0x62bf318 0x62c13c0 0x651a8e8 0x651c2c8 0x66ff0d8 0x5283010 0x52a3bf8 0x56d4208 0x577dea0 0x57ccb18 0x57cd1b8 0x57cd858 0x57cdee8 0x57ce4f0 0x57ceb00 0x57d5d70 0x57cf880 0x57cfe90 0x57d04d0 0x57d4958 0x581e800 0x54d7090 0x5946d58 0x59eac68 0x5a41658 0x5a426f8 0x5a43778 0x5a44ce8 0x5a45df8 0x5a46e78 0x5a48d90 0x5a49e70 0x5b3dbd8 0x5b76fd8 0x5b4a268 0x5b4b1c8 0x5b4c128 0x5b4d098 0x5b9a428 0x5b4d788 0x5bb0228 0x5b4e6e8 0x5b4f648 0x5b505a8 0x5b57818 0x5b80e68 0x5b83490 0x5b85b68 0x5b90928 0x5b935f8 0x5b96de8 0x5ba3f28 0x5ba6a80 0x5baada8 0x5bad768 0x5bbd358 0x5bc20c8 0x5bc6d68 0x6018b60 0x5d488f8 0x5d49590 0x5d49ff8 0x5d4aa58 0x5d4b548 0x5ded070 0x5dedad0 0x5dee4d0 | | |-CXXOperatorCallExpr 0x7f24e96720d8 <line:5:1, line:6:68> '<dependent type>' '<<' | | | |-UnresolvedLookupExpr 0x7f24e9671d98 <col:65> '<overloaded function type>' lvalue (ADL) = 'operator<<' 0x4da1308 0x4d51d48 0x4d516a8 0x4d9e8c8 0x4d9eb50 0x4d9ede0 0x4d9f070 0x4d9f300 0x4d9f590 0x4d9f820 0x4d9fab0 0x4d9fd40 0x4d9ffd0 0x4da0260 0x4da04f0 0x4da0780 0x4da0a10 0x4da0cd8 0x628f058 0x62916c8 0x6298968 0x6299858 0x62a6cd8 0x62a6ff8 0x62b9488 0x62ba588 0x62bb8c8 0x62bcc98 0x62bdfd8 0x62bf318 0x62c13c0 0x651a8e8 0x651c2c8 0x66ff0d8 0x5283010 0x52a3bf8 0x56d4208 0x577dea0 0x57ccb18 0x57cd1b8 0x57cd858 0x57cdee8 0x57ce4f0 0x57ceb00 0x57d5d70 0x57cf880 0x57cfe90 0x57d04d0 0x57d4958 0x581e800 0x54d7090 0x5946d58 0x59eac68 0x5a41658 0x5a426f8 0x5a43778 0x5a44ce8 0x5a45df8 0x5a46e78 0x5a48d90 0x5a49e70 0x5b3dbd8 0x5b76fd8 0x5b4a268 0x5b4b1c8 0x5b4c128 0x5b4d098 0x5b9a428 0x5b4d788 0x5bb0228 0x5b4e6e8 0x5b4f648 0x5b505a8 0x5b57818 0x5b80e68 0x5b83490 0x5b85b68 0x5b90928 0x5b935f8 0x5b96de8 0x5ba3f28 0x5ba6a80 0x5baada8 0x5bad768 0x5bbd358 0x5bc20c8 0x5bc6d68 0x6018b60 0x5d488f8 0x5d49590 0x5d49ff8 0x5d4aa58 0x5d4b548 0x5ded070 0x5dedad0 0x5dee4d0 | | | |-CXXOperatorCallExpr 0x7f24e9671d40 <line:5:1, line:6:58> '<dependent type>' '<<' | | | | |-UnresolvedLookupExpr 0x7f24e9671a00 <col:55> '<overloaded function type>' lvalue (ADL) = 'operator<<' 0x4da1308 0x4d51d48 0x4d516a8 0x4d9e8c8 0x4d9eb50 0x4d9ede0 0x4d9f070 0x4d9f300 0x4d9f590 0x4d9f820 0x4d9fab0 0x4d9fd40 0x4d9ffd0 0x4da0260 0x4da04f0 0x4da0780 0x4da0a10 0x4da0cd8 0x628f058 0x62916c8 0x6298968 0x6299858 0x62a6cd8 0x62a6ff8 0x62b9488 0x62ba588 0x62bb8c8 0x62bcc98 0x62bdfd8 0x62bf318 0x62c13c0 0x651a8e8 0x651c2c8 0x66ff0d8 0x5283010 0x52a3bf8 0x56d4208 0x577dea0 0x57ccb18 0x57cd1b8 0x57cd858 0x57cdee8 0x57ce4f0 0x57ceb00 0x57d5d70 0x57cf880 0x57cfe90 0x57d04d0 0x57d4958 0x581e800 0x54d7090 0x5946d58 0x59eac68 0x5a41658 0x5a426f8 0x5a43778 0x5a44ce8 0x5a45df8 0x5a46e78 0x5a48d90 0x5a49e70 0x5b3dbd8 0x5b76fd8 0x5b4a268 0x5b4b1c8 0x5b4c128 0x5b4d098 0x5b9a428 0x5b4d788 0x5bb0228 0x5b4e6e8 0x5b4f648 0x5b505a8 0x5b57818 0x5b80e68 0x5b83490 0x5b85b68 0x5b90928 0x5b935f8 0x5b96de8 0x5ba3f28 0x5ba6a80 0x5baada8 0x5bad768 0x5bbd358 0x5bc20c8 0x5bc6d68 0x6018b60 0x5d488f8 0x5d49590 0x5d49ff8 0x5d4aa58 0x5d4b548 0x5ded070 0x5dedad0 0x5dee4d0 | | | | |-CXXOperatorCallExpr 0x7f24e96719a8 <line:5:1, line:6:52> '<dependent type>' '<<' | | | | | |-UnresolvedLookupExpr 0x7f24e9671668 <col:49> '<overloaded function type>' lvalue (ADL) = 'operator<<' 0x4da1308 0x4d51d48 0x4d516a8 0x4d9e8c8 0x4d9eb50 0x4d9ede0 0x4d9f070 0x4d9f300 0x4d9f590 0x4d9f820 0x4d9fab0 0x4d9fd40 0x4d9ffd0 0x4da0260 0x4da04f0 0x4da0780 0x4da0a10 0x4da0cd8 0x628f058 0x62916c8 0x6298968 0x6299858 0x62a6cd8 0x62a6ff8 0x62b9488 0x62ba588 0x62bb8c8 0x62bcc98 0x62bdfd8 0x62bf318 0x62c13c0 0x651a8e8 0x651c2c8 0x66ff0d8 0x5283010 0x52a3bf8 0x56d4208 0x577dea0 0x57ccb18 0x57cd1b8 0x57cd858 0x57cdee8 0x57ce4f0 0x57ceb00 0x57d5d70 0x57cf880 0x57cfe90 0x57d04d0 0x57d4958 0x581e800 0x54d7090 0x5946d58 0x59eac68 0x5a41658 0x5a426f8 0x5a43778 0x5a44ce8 0x5a45df8 0x5a46e78 0x5a48d90 0x5a49e70 0x5b3dbd8 0x5b76fd8 0x5b4a268 0x5b4b1c8 0x5b4c128 0x5b4d098 0x5b9a428 0x5b4d788 0x5bb0228 0x5b4e6e8 0x5b4f648 0x5b505a8 0x5b57818 0x5b80e68 0x5b83490 0x5b85b68 0x5b90928 0x5b935f8 0x5b96de8 0x5ba3f28 0x5ba6a80 0x5baada8 0x5bad768 0x5bbd358 0x5bc20c8 0x5bc6d68 0x6018b60 0x5d488f8 0x5d49590 0x5d49ff8 0x5d4aa58 0x5d4b548 0x5ded070 0x5dedad0 0x5dee4d0 | | | | | |-CXXOperatorCallExpr 0x7f24e9671610 <line:5:1, line:6:41> '<dependent type>' '<<' | | | | | | |-UnresolvedLookupExpr 0x7f24e96712d0 <col:38> '<overloaded function type>' lvalue (ADL) = 'operator<<' 0x4da1308 0x4d51d48 0x4d516a8 0x4d9e8c8 0x4d9eb50 0x4d9ede0 0x4d9f070 0x4d9f300 0x4d9f590 0x4d9f820 0x4d9fab0 0x4d9fd40 0x4d9ffd0 0x4da0260 0x4da04f0 0x4da0780 0x4da0a10 0x4da0cd8 0x628f058 0x62916c8 0x6298968 0x6299858 0x62a6cd8 0x62a6ff8 0x62b9488 0x62ba588 0x62bb8c8 0x62bcc98 0x62bdfd8 0x62bf318 0x62c13c0 0x651a8e8 0x651c2c8 0x66ff0d8 0x5283010 0x52a3bf8 0x56d4208 0x577dea0 0x57ccb18 0x57cd1b8 0x57cd858 0x57cdee8 0x57ce4f0 0x57ceb00 0x57d5d70 0x57cf880 0x57cfe90 0x57d04d0 0x57d4958 0x581e800 0x54d7090 0x5946d58 0x59eac68 0x5a41658 0x5a426f8 0x5a43778 0x5a44ce8 0x5a45df8 0x5a46e78 0x5a48d90 0x5a49e70 0x5b3dbd8 0x5b76fd8 0x5b4a268 0x5b4b1c8 0x5b4c128 0x5b4d098 0x5b9a428 0x5b4d788 0x5bb0228 0x5b4e6e8 0x5b4f648 0x5b505a8 0x5b57818 0x5b80e68 0x5b83490 0x5b85b68 0x5b90928 0x5b935f8 0x5b96de8 0x5ba3f28 0x5ba6a80 0x5baada8 0x5bad768 0x5bbd358 0x5bc20c8 0x5bc6d68 0x6018b60 0x5d488f8 0x5d49590 0x5d49ff8 0x5d4aa58 0x5d4b548 0x5ded070 0x5dedad0 0x5dee4d0 | | | | | | |-CXXOperatorCallExpr 0x7f24e9671278 <line:5:1, line:6:35> '<dependent type>' '<<' | | | | | | | |-UnresolvedLookupExpr 0x7f24e9670f38 <col:32> '<overloaded function type>' lvalue (ADL) = 'operator<<' 0x4da1308 0x4d51d48 0x4d516a8 0x4d9e8c8 0x4d9eb50 0x4d9ede0 0x4d9f070 0x4d9f300 0x4d9f590 0x4d9f820 0x4d9fab0 0x4d9fd40 0x4d9ffd0 0x4da0260 0x4da04f0 0x4da0780 0x4da0a10 0x4da0cd8 0x628f058 0x62916c8 0x6298968 0x6299858 0x62a6cd8 0x62a6ff8 0x62b9488 0x62ba588 0x62bb8c8 0x62bcc98 0x62bdfd8 0x62bf318 0x62c13c0 0x651a8e8 0x651c2c8 0x66ff0d8 0x5283010 0x52a3bf8 0x56d4208 0x577dea0 0x57ccb18 0x57cd1b8 0x57cd858 0x57cdee8 0x57ce4f0 0x57ceb00 0x57d5d70 0x57cf880 0x57cfe90 0x57d04d0 0x57d4958 0x581e800 0x54d7090 0x5946d58 0x59eac68 0x5a41658 0x5a426f8 0x5a43778 0x5a44ce8 0x5a45df8 0x5a46e78 0x5a48d90 0x5a49e70 0x5b3dbd8 0x5b76fd8 0x5b4a268 0x5b4b1c8 0x5b4c128 0x5b4d098 0x5b9a428 0x5b4d788 0x5bb0228 0x5b4e6e8 0x5b4f648 0x5b505a8 0x5b57818 0x5b80e68 0x5b83490 0x5b85b68 0x5b90928 0x5b935f8 0x5b96de8 0x5ba3f28 0x5ba6a80 0x5baada8 0x5bad768 0x5bbd358 0x5bc20c8 0x5bc6d68 0x6018b60 0x5d488f8 0x5d49590 0x5d49ff8 0x5d4aa58 0x5d4b548 0x5ded070 0x5dedad0 0x5dee4d0 | | | | | | | |-CXXOperatorCallExpr 0x7f24e9670ee0 <line:5:1, line:6:14> '<dependent type>' '<<' | | | | | | | | |-UnresolvedLookupExpr 0x7f24e9670ba0 <col:11> '<overloaded function type>' lvalue (ADL) = 'operator<<' 0x4da1308 0x4d51d48 0x4d516a8 0x4d9e8c8 0x4d9eb50 0x4d9ede0 0x4d9f070 0x4d9f300 0x4d9f590 0x4d9f820 0x4d9fab0 0x4d9fd40 0x4d9ffd0 0x4da0260 0x4da04f0 0x4da0780 0x4da0a10 0x4da0cd8 0x628f058 0x62916c8 0x6298968 0x6299858 0x62a6cd8 0x62a6ff8 0x62b9488 0x62ba588 0x62bb8c8 0x62bcc98 0x62bdfd8 0x62bf318 0x62c13c0 0x651a8e8 0x651c2c8 0x66ff0d8 0x5283010 0x52a3bf8 0x56d4208 0x577dea0 0x57ccb18 0x57cd1b8 0x57cd858 0x57cdee8 0x57ce4f0 0x57ceb00 0x57d5d70 0x57cf880 0x57cfe90 0x57d04d0 0x57d4958 0x581e800 0x54d7090 0x5946d58 0x59eac68 0x5a41658 0x5a426f8 0x5a43778 0x5a44ce8 0x5a45df8 0x5a46e78 0x5a48d90 0x5a49e70 0x5b3dbd8 0x5b76fd8 0x5b4a268 0x5b4b1c8 0x5b4c128 0x5b4d098 0x5b9a428 0x5b4d788 0x5bb0228 0x5b4e6e8 0x5b4f648 0x5b505a8 0x5b57818 0x5b80e68 0x5b83490 0x5b85b68 0x5b90928 0x5b935f8 0x5b96de8 0x5ba3f28 0x5ba6a80 0x5baada8 0x5bad768 0x5bbd358 0x5bc20c8 0x5bc6d68 0x6018b60 0x5d488f8 0x5d49590 0x5d49ff8 0x5d4aa58 0x5d4b548 0x5ded070 0x5dedad0 0x5dee4d0 | | | | | | | | |-CXXOperatorCallExpr 0x7f24e9670b08 <line:5:1, col:55> '<dependent type>' '<<' | | | | | | | | | |-UnresolvedLookupExpr 0x7f24e96707c8 <col:52> '<overloaded function type>' lvalue (ADL) = 'operator<<' 0x4da1308 0x4d51d48 0x4d516a8 0x4d9e8c8 0x4d9eb50 0x4d9ede0 0x4d9f070 0x4d9f300 0x4d9f590 0x4d9f820 0x4d9fab0 0x4d9fd40 0x4d9ffd0 0x4da0260 0x4da04f0 0x4da0780 0x4da0a10 0x4da0cd8 0x628f058 0x62916c8 0x6298968 0x6299858 0x62a6cd8 0x62a6ff8 0x62b9488 0x62ba588 0x62bb8c8 0x62bcc98 0x62bdfd8 0x62bf318 0x62c13c0 0x651a8e8 0x651c2c8 0x66ff0d8 0x5283010 0x52a3bf8 0x56d4208 0x577dea0 0x57ccb18 0x57cd1b8 0x57cd858 0x57cdee8 0x57ce4f0 0x57ceb00 0x57d5d70 0x57cf880 0x57cfe90 0x57d04d0 0x57d4958 0x581e800 0x54d7090 0x5946d58 0x59eac68 0x5a41658 0x5a426f8 0x5a43778 0x5a44ce8 0x5a45df8 0x5a46e78 0x5a48d90 0x5a49e70 0x5b3dbd8 0x5b76fd8 0x5b4a268 0x5b4b1c8 0x5b4c128 0x5b4d098 0x5b9a428 0x5b4d788 0x5bb0228 0x5b4e6e8 0x5b4f648 0x5b505a8 0x5b57818 0x5b80e68 0x5b83490 0x5b85b68 0x5b90928 0x5b935f8 0x5b96de8 0x5ba3f28 0x5ba6a80 0x5baada8 0x5bad768 0x5bbd358 0x5bc20c8 0x5bc6d68 0x6018b60 0x5d488f8 0x5d49590 0x5d49ff8 0x5d4aa58 0x5d4b548 0x5ded070 0x5dedad0 0x5dee4d0 | | | | | | | | | |-CXXOperatorCallExpr 0x7f24e9670770 <col:1, col:44> '<dependent type>' '<<' | | | | | | | | | | |-UnresolvedLookupExpr 0x7f24e9670430 <col:41> '<overloaded function type>' lvalue (ADL) = 'operator<<' 0x4da1308 0x4d51d48 0x4d516a8 0x4d9e8c8 0x4d9eb50 0x4d9ede0 0x4d9f070 0x4d9f300 0x4d9f590 0x4d9f820 0x4d9fab0 0x4d9fd40 0x4d9ffd0 0x4da0260 0x4da04f0 0x4da0780 0x4da0a10 0x4da0cd8 0x628f058 0x62916c8 0x6298968 0x6299858 0x62a6cd8 0x62a6ff8 0x62b9488 0x62ba588 0x62bb8c8 0x62bcc98 0x62bdfd8 0x62bf318 0x62c13c0 0x651a8e8 0x651c2c8 0x66ff0d8 0x5283010 0x52a3bf8 0x56d4208 0x577dea0 0x57ccb18 0x57cd1b8 0x57cd858 0x57cdee8 0x57ce4f0 0x57ceb00 0x57d5d70 0x57cf880 0x57cfe90 0x57d04d0 0x57d4958 0x581e800 0x54d7090 0x5946d58 0x59eac68 0x5a41658 0x5a426f8 0x5a43778 0x5a44ce8 0x5a45df8 0x5a46e78 0x5a48d90 0x5a49e70 0x5b3dbd8 0x5b76fd8 0x5b4a268 0x5b4b1c8 0x5b4c128 0x5b4d098 0x5b9a428 0x5b4d788 0x5bb0228 0x5b4e6e8 0x5b4f648 0x5b505a8 0x5b57818 0x5b80e68 0x5b83490 0x5b85b68 0x5b90928 0x5b935f8 0x5b96de8 0x5ba3f28 0x5ba6a80 0x5baada8 0x5bad768 0x5bbd358 0x5bc20c8 0x5bc6d68 0x6018b60 0x5d488f8 0x5d49590 0x5d49ff8 0x5d4aa58 0x5d4b548 0x5ded070 0x5dedad0 0x5dee4d0 | | | | | | | | | | |-CXXOperatorCallExpr 0x7f24e96703b8 <col:1, col:34> 'basic_ostream<char, char_traits<char> >':'std::basic_ostream<char>' lvalue '<<' | | | | | | | | | | | |-ImplicitCastExpr 0x7f24e96703a0 <col:31> 'basic_ostream<char, char_traits<char> > &(*)(basic_ostream<char, char_traits<char> > &, const char *)' <FunctionToPointerDecay> | | | | | | | | | | | | `-DeclRefExpr 0x7f24e9670380 <col:31> 'basic_ostream<char, char_traits<char> > &(basic_ostream<char, char_traits<char> > &, const char *)' lvalue Function 0x7f24e9022958 'operator<<' 'basic_ostream<char, char_traits<char> > &(basic_ostream<char, char_traits<char> > &, const char *)' | | | | | | | | | | | |-CXXOperatorCallExpr 0x7f24e966eb68 <col:1, col:28> 'std::ostream':'std::basic_ostream<char>' lvalue '<<' adl | | | | | | | | | | | | |-ImplicitCastExpr 0x7f24e966eb50 <col:25> 'std::ostream &(*)(std::ostream &, const RVec<float> &)' <FunctionToPointerDecay> | | | | | | | | | | | | | `-DeclRefExpr 0x7f24e966eb30 <col:25> 'std::ostream &(std::ostream &, const RVec<float> &)' lvalue Function 0x7f24e94e7da8 'operator<<' 'std::ostream &(std::ostream &, const RVec<float> &)' | | | | | | | | | | | | |-CXXOperatorCallExpr 0x7f24e966c188 <col:1, col:14> 'basic_ostream<char, char_traits<char> >':'std::basic_ostream<char>' lvalue '<<' | | | | | | | | | | | | | |-ImplicitCastExpr 0x7f24e966c170 <col:11> 'basic_ostream<char, char_traits<char> > &(*)(basic_ostream<char, char_traits<char> > &, const char *)' <FunctionToPointerDecay> | | | | | | | | | | | | | | `-DeclRefExpr 0x7f24e966c150 <col:11> 'basic_ostream<char, char_traits<char> > &(basic_ostream<char, char_traits<char> > &, const char *)' lvalue Function 0x7f24e9022958 'operator<<' 'basic_ostream<char, char_traits<char> > &(basic_ostream<char, char_traits<char> > &, const char *)' | | | | | | | | | | | | | |-DeclRefExpr 0x7f24e96698c8 <col:1, col:6> 'ostream':'std::basic_ostream<char>' lvalue Var 0x5a623d8 'cout' 'ostream':'std::basic_ostream<char>' | | | | | | | | | | | | | `-ImplicitCastExpr 0x7f24e966c138 <col:14> 'const char *' <ArrayToPointerDecay> | | | | | | | | | | | | | `-StringLiteral 0x7f24e9669978 <col:14> 'const char[9]' lvalue "Mean of " | | | | | | | | | | | | `-ImplicitCastExpr 0x7f24e966eb18 <col:28> 'const RVec<float>':'const ROOT::VecOps::RVec<float>' lvalue <NoOp> | | | | | | | | | | | | `-DeclRefExpr 0x7f24e966c1c0 <col:28> 'ROOT::RVecF':'ROOT::VecOps::RVec<float>' lvalue Var 0x8d9a2b0 'v1' 'ROOT::RVecF':'ROOT::VecOps::RVec<float>' | | | | | | | | | | | `-ImplicitCastExpr 0x7f24e9670368 <col:34> 'const char *' <ArrayToPointerDecay> | | | | | | | | | | | `-StringLiteral 0x7f24e966eba0 <col:34> 'const char[5]' lvalue " is " | | | | | | | | | | `-DeclRefExpr 0x7f24e96703f0 <col:44> 'auto' lvalue Var 0x7f24e9668078 'v1_mean' 'auto' | | | | | | | | | `-StringLiteral 0x7f24e96707a8 <col:55> 'const char[2]' lvalue "\n" | | | | | | | | `-StringLiteral 0x7f24e9670b78 <line:6:14> 'const char[16]' lvalue "Dot product of " | | | | | | | `-DeclRefExpr 0x7f24e9670f18 <col:35> 'ROOT::RVecF':'ROOT::VecOps::RVec<float>' lvalue Var 0x8d9a2b0 'v1' 'ROOT::RVecF':'ROOT::VecOps::RVec<float>' | | | | | | `-StringLiteral 0x7f24e96712b0 <col:41> 'const char[6]' lvalue " and " | | | | | `-DeclRefExpr 0x7f24e9671648 <col:52> 'ROOT::RVecF':'ROOT::VecOps::RVec<float>' lvalue Var 0x8da6d88 'v2' 'ROOT::RVecF':'ROOT::VecOps::RVec<float>' | | | | `-StringLiteral 0x7f24e96719e0 <col:58> 'const char[5]' lvalue " is " | | | `-DeclRefExpr 0x7f24e9671d78 <col:68> 'decltype(v0[0] * v1[0])':'float' lvalue Var 0x7f24e96683b8 'v1_dot_v2' 'decltype(v0[0] * v1[0])':'float' | | `-UnresolvedLookupExpr 0x7f24e9672130 <col:81, col:86> '<overloaded function type>' lvalue (no ADL) = 'endl' 0x57d0b10 | `-NullStmt 0x7f24e96724f0 <line:7:1> |-AnnotateAttr 0x7f24e9668150 <<invalid sloc>> Implicit R"ATTRDUMP(__ResolveAtRuntime)ATTRDUMP" `-AnnotateAttr 0x7f24e9668260 <<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 0x7f24ea6c43d8 <input_line_58:1:1, line:7:1> line:1:6 __cling_Un1Qu326 'void (void *)' |-ParmVarDecl 0x7f24ea6c4320 <col:23, col:29> col:29 vpClingValue 'void *' |-CompoundStmt 0x7f24ea6cc5f8 <col:43, line:7:1> | |-DeclStmt 0x7f24ea6c52e0 <line:2:2, col:61> | | `-VarDecl 0x7f24ea6c44f0 <col:2, col:60> col:7 used v_transf 'auto' cinit | | `-CallExpr 0x7f24ea6c52b0 <col:18, col:60> '<dependent type>' | | |-DeclRefExpr 0x7f24ea6c4740 <col:18> '<dependent type>' lvalue Var 0x7f24ea6c4668 'Map' '<dependent type>' | | |-DeclRefExpr 0x7f24ea6c4780 <col:22> 'ROOT::RVecF':'ROOT::VecOps::RVec<float>' lvalue Var 0x8d9a2b0 'v1' 'ROOT::RVecF':'ROOT::VecOps::RVec<float>' | | `-LambdaExpr 0x7f24ea6c5178 <col:26, col:59> '(lambda at input_line_58:2:26)' | | |-CXXRecordDecl 0x7f24ea6c48e0 <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 0x7f24ea6c4a48 <col:37, col:59> col:26 constexpr operator() 'double (double) const' inline | | | | |-ParmVarDecl 0x7f24ea6c47c0 <col:29, col:36> col:36 used x 'double' | | | | `-CompoundStmt 0x7f24ea6c4d70 <col:39, col:59> | | | | `-ReturnStmt 0x7f24ea6c4d60 <col:41, col:56> | | | | `-BinaryOperator 0x7f24ea6c4bd0 <col:48, col:56> 'double' '/' | | | | |-BinaryOperator 0x7f24ea6c4b78 <col:48, col:52> 'double' '*' | | | | | |-ImplicitCastExpr 0x7f24ea6c4b48 <col:48> 'double' <LValueToRValue> | | | | | | `-DeclRefExpr 0x7f24ea6c4b08 <col:48> 'double' lvalue ParmVar 0x7f24ea6c47c0 'x' 'double' | | | | | `-ImplicitCastExpr 0x7f24ea6c4b60 <col:52> 'double' <IntegralToFloating> | | | | | `-IntegerLiteral 0x7f24ea6c4b28 <col:52> 'int' 2 | | | | `-ImplicitCastExpr 0x7f24ea6c4bb8 <col:56> 'double' <IntegralToFloating> | | | | `-IntegerLiteral 0x7f24ea6c4b98 <col:56> 'int' 3 | | | |-CXXConversionDecl 0x7f24ea6c4fb0 <col:26, col:59> col:26 implicit constexpr operator double (*)(double) 'double (*() const noexcept)(double)' inline | | | |-CXXMethodDecl 0x7f24ea6c5070 <col:26, col:59> col:26 implicit __invoke 'double (double)' static inline | | | | `-ParmVarDecl 0x7f24ea6c4f40 <col:29, col:36> col:36 x 'double' | | | `-CXXDestructorDecl 0x7f24ea6c51a8 <col:26> col:26 implicit referenced ~(lambda at input_line_58:2:26) 'void () noexcept' inline default trivial | | `-CompoundStmt 0x7f24ea6c4d70 <col:39, col:59> | | `-ReturnStmt 0x7f24ea6c4d60 <col:41, col:56> | | `-BinaryOperator 0x7f24ea6c4bd0 <col:48, col:56> 'double' '/' | | |-BinaryOperator 0x7f24ea6c4b78 <col:48, col:52> 'double' '*' | | | |-ImplicitCastExpr 0x7f24ea6c4b48 <col:48> 'double' <LValueToRValue> | | | | `-DeclRefExpr 0x7f24ea6c4b08 <col:48> 'double' lvalue ParmVar 0x7f24ea6c47c0 'x' 'double' | | | `-ImplicitCastExpr 0x7f24ea6c4b60 <col:52> 'double' <IntegralToFloating> | | | `-IntegerLiteral 0x7f24ea6c4b28 <col:52> 'int' 2 | | `-ImplicitCastExpr 0x7f24ea6c4bb8 <col:56> 'double' <IntegralToFloating> | | `-IntegerLiteral 0x7f24ea6c4b98 <col:56> 'int' 3 | |-CXXOperatorCallExpr 0x7f24ea6cc5b8 <line:4:1, col:98> '<dependent type>' '<<' | | |-UnresolvedLookupExpr 0x7f24ea6cc278 <col:95> '<overloaded function type>' lvalue (ADL) = 'operator<<' 0x4da1308 0x4d51d48 0x4d516a8 0x4d9e8c8 0x4d9eb50 0x4d9ede0 0x4d9f070 0x4d9f300 0x4d9f590 0x4d9f820 0x4d9fab0 0x4d9fd40 0x4d9ffd0 0x4da0260 0x4da04f0 0x4da0780 0x4da0a10 0x4da0cd8 0x628f058 0x62916c8 0x6298968 0x6299858 0x62a6cd8 0x62a6ff8 0x62b9488 0x62ba588 0x62bb8c8 0x62bcc98 0x62bdfd8 0x62bf318 0x62c13c0 0x651a8e8 0x651c2c8 0x66ff0d8 0x5283010 0x52a3bf8 0x56d4208 0x577dea0 0x57ccb18 0x57cd1b8 0x57cd858 0x57cdee8 0x57ce4f0 0x57ceb00 0x57d5d70 0x57cf880 0x57cfe90 0x57d04d0 0x57d4958 0x581e800 0x54d7090 0x5946d58 0x59eac68 0x5a41658 0x5a426f8 0x5a43778 0x5a44ce8 0x5a45df8 0x5a46e78 0x5a48d90 0x5a49e70 0x5b3dbd8 0x5b76fd8 0x5b4a268 0x5b4b1c8 0x5b4c128 0x5b4d098 0x5b9a428 0x5b4d788 0x5bb0228 0x5b4e6e8 0x5b4f648 0x5b505a8 0x5b57818 0x5b80e68 0x5b83490 0x5b85b68 0x5b90928 0x5b935f8 0x5b96de8 0x5ba3f28 0x5ba6a80 0x5baada8 0x5bad768 0x5bbd358 0x5bc20c8 0x5bc6d68 0x6018b60 0x5d488f8 0x5d49590 0x5d49ff8 0x5d4aa58 0x5d4b548 0x5ded070 0x5dedad0 0x5dee4d0 | | |-CXXOperatorCallExpr 0x7f24ea6cc220 <col:1, col:86> '<dependent type>' '<<' | | | |-UnresolvedLookupExpr 0x7f24ea6cbee0 <col:83> '<overloaded function type>' lvalue (ADL) = 'operator<<' 0x4da1308 0x4d51d48 0x4d516a8 0x4d9e8c8 0x4d9eb50 0x4d9ede0 0x4d9f070 0x4d9f300 0x4d9f590 0x4d9f820 0x4d9fab0 0x4d9fd40 0x4d9ffd0 0x4da0260 0x4da04f0 0x4da0780 0x4da0a10 0x4da0cd8 0x628f058 0x62916c8 0x6298968 0x6299858 0x62a6cd8 0x62a6ff8 0x62b9488 0x62ba588 0x62bb8c8 0x62bcc98 0x62bdfd8 0x62bf318 0x62c13c0 0x651a8e8 0x651c2c8 0x66ff0d8 0x5283010 0x52a3bf8 0x56d4208 0x577dea0 0x57ccb18 0x57cd1b8 0x57cd858 0x57cdee8 0x57ce4f0 0x57ceb00 0x57d5d70 0x57cf880 0x57cfe90 0x57d04d0 0x57d4958 0x581e800 0x54d7090 0x5946d58 0x59eac68 0x5a41658 0x5a426f8 0x5a43778 0x5a44ce8 0x5a45df8 0x5a46e78 0x5a48d90 0x5a49e70 0x5b3dbd8 0x5b76fd8 0x5b4a268 0x5b4b1c8 0x5b4c128 0x5b4d098 0x5b9a428 0x5b4d788 0x5bb0228 0x5b4e6e8 0x5b4f648 0x5b505a8 0x5b57818 0x5b80e68 0x5b83490 0x5b85b68 0x5b90928 0x5b935f8 0x5b96de8 0x5ba3f28 0x5ba6a80 0x5baada8 0x5bad768 0x5bbd358 0x5bc20c8 0x5bc6d68 0x6018b60 0x5d488f8 0x5d49590 0x5d49ff8 0x5d4aa58 0x5d4b548 0x5ded070 0x5dedad0 0x5dee4d0 | | | |-CXXOperatorCallExpr 0x7f24ea6cbe68 <col:1, col:70> 'basic_ostream<char, char_traits<char> >':'std::basic_ostream<char>' lvalue '<<' | | | | |-ImplicitCastExpr 0x7f24ea6cbe50 <col:67> 'basic_ostream<char, char_traits<char> > &(*)(basic_ostream<char, char_traits<char> > &, const char *)' <FunctionToPointerDecay> | | | | | `-DeclRefExpr 0x7f24ea6cbe30 <col:67> 'basic_ostream<char, char_traits<char> > &(basic_ostream<char, char_traits<char> > &, const char *)' lvalue Function 0x7f24e9022958 'operator<<' 'basic_ostream<char, char_traits<char> > &(basic_ostream<char, char_traits<char> > &, const char *)' | | | | |-CXXOperatorCallExpr 0x7f24ea6ca608 <col:1, col:64> 'std::ostream':'std::basic_ostream<char>' lvalue '<<' adl | | | | | |-ImplicitCastExpr 0x7f24ea6ca5f0 <col:61> 'std::ostream &(*)(std::ostream &, const RVec<float> &)' <FunctionToPointerDecay> | | | | | | `-DeclRefExpr 0x7f24ea6ca5d0 <col:61> 'std::ostream &(std::ostream &, const RVec<float> &)' lvalue Function 0x7f24e94e7da8 'operator<<' 'std::ostream &(std::ostream &, const RVec<float> &)' | | | | | |-CXXOperatorCallExpr 0x7f24ea6c7c28 <col:1, col:14> 'basic_ostream<char, char_traits<char> >':'std::basic_ostream<char>' lvalue '<<' | | | | | | |-ImplicitCastExpr 0x7f24ea6c7c10 <col:11> 'basic_ostream<char, char_traits<char> > &(*)(basic_ostream<char, char_traits<char> > &, const char *)' <FunctionToPointerDecay> | | | | | | | `-DeclRefExpr 0x7f24ea6c7bf0 <col:11> 'basic_ostream<char, char_traits<char> > &(basic_ostream<char, char_traits<char> > &, const char *)' lvalue Function 0x7f24e9022958 'operator<<' 'basic_ostream<char, char_traits<char> > &(basic_ostream<char, char_traits<char> > &, const char *)' | | | | | | |-DeclRefExpr 0x7f24ea6c5348 <col:1, col:6> 'ostream':'std::basic_ostream<char>' lvalue Var 0x5a623d8 'cout' 'ostream':'std::basic_ostream<char>' | | | | | | `-ImplicitCastExpr 0x7f24ea6c7bd8 <col:14> 'const char *' <ArrayToPointerDecay> | | | | | | `-StringLiteral 0x7f24ea6c53f8 <col:14> 'const char[45]' lvalue "Applying [](double x){return x * 2 / 3;} to " | | | | | `-ImplicitCastExpr 0x7f24ea6ca5b8 <col:64> 'const RVec<float>':'const ROOT::VecOps::RVec<float>' lvalue <NoOp> | | | | | `-DeclRefExpr 0x7f24ea6c7c60 <col:64> 'ROOT::RVecF':'ROOT::VecOps::RVec<float>' lvalue Var 0x8d9a2b0 'v1' 'ROOT::RVecF':'ROOT::VecOps::RVec<float>' | | | | `-ImplicitCastExpr 0x7f24ea6cbe18 <col:70> 'const char *' <ArrayToPointerDecay> | | | | `-StringLiteral 0x7f24ea6ca640 <col:70> 'const char[11]' lvalue " leads to " | | | `-DeclRefExpr 0x7f24ea6cbea0 <col:86> 'auto' lvalue Var 0x7f24ea6c44f0 'v_transf' 'auto' | | `-StringLiteral 0x7f24ea6cc258 <col:98> 'const char[2]' lvalue "\n" | `-NullStmt 0x7f24ea6cc5f0 <line:6:1> |-AnnotateAttr 0x7f24ea6c45c8 <<invalid sloc>> Implicit R"ATTRDUMP(__ResolveAtRuntime)ATTRDUMP" `-AnnotateAttr 0x7f24ea6c46d0 <<invalid sloc>> Implicit R"ATTRDUMP(__ResolveAtRuntime)ATTRDUMP" <<<NULL>>>