Valarray generalized slice selector class represents a valarray generalized slice selector (a multidimensional slice). It does not contain nor refer to any element – it only describes a selection of elements to be used as an index in valarray::operator[].
In other words, std::gslice is the selector class that identifies a subset of std::valarray indices defined by a multi-level set of strides and sizes. Objects of type std::gslice can be used as indices with valarray’s operator[] to select, for example, columns of a multidimensional array represented as a valarray.
Given the starting value s, a list of strides ij and a list of sizes dj, a std::gslice constructed from these values selects the set of indices:
kj = s + ?j(ijdj)
A valarray generalized slice is specified by a starting index, a set of sizes, and a set of strides. It produces a multidimensional combination of slice selections.
Syntax:
gslice( std::size_t start, const std::valarray& sizes, const std::valarray& strides );
Parameters:
- size_t start: index of the first element in the selection.
- size_t (size): number of elements in the selection.
- size_t (stride: span that separates the elements selected
In given Syntax, default constructor is Equivalent to gslice(0, std::valarray(), std::valarray()). This constructor exists only to allow construction of arrays of slices.
Constructs a new slice with parameters start, sizes, strides.
Header file:
<valarray>
Example 1:
start = 1 , size = {2, 3} , stride = {7, 2} Input : 0 1 2 3 4 5 6 7 8 9 10 11 12 13 Output : 1 3 5 8 10 12 Explanation: 1 + 0*7 + 0*2 = 1, 1 + 0*7 + 1*2 = 3, 1 + 0*7 + 2*2 = 5, 1 + 1*7 + 0*2 = 8, 1 + 1*7 + 1*2 = 10, 1 + 1*7 + 2*2 = 12
Solution : gslice example in C++ Program:
// C++ Program to demonstrate use of // gslice to address columns of 3D array #include <iostream> // std::cout #include <valarray> // std::gslice void test_print(std::valarray< int >& v, int rows, int cols,
int planes)
{ for ( int r = 0; r < rows; ++r) {
for ( int c = 0; c < cols; ++c) {
for ( int z = 0; z < planes; ++z)
std::cout
<< v[r * cols * planes + c * planes + z]
<< ' ' ;
std::cout << '\n' ;
}
std::cout << '\n' ;
}
} // Driver Code int main()
{ // 3d array: 2 x 4 x 3 elements
std::valarray< int > v
= { 111, 112, 113, 121, 122, 123, 131, 132,
133, 141, 142, 143, 211, 212, 213, 221,
222, 223, 231, 232, 233, 241, 242, 243 };
// int ar3D [2][4][3]
std::cout << "Initial 2x4x3 array:\n" ;
test_print(v, 2, 4, 3);
// update every value in the first columns of both
// planes
v[std::gslice(0, { 2, 4 }, { 4 * 3, 3 })] = 1;
// subtract the third column from the
// second column in the 1st plane
v[std::gslice(1, { 1, 4 }, { 4 * 3, 3 })]
-= v[std::gslice(2, { 1, 4 }, { 4 * 3, 3 })];
std::cout << "After column operations: \n" ;
test_print(v, 2, 4, 3);
return 0;
} |
gslice: 1 3 5 8 10 12
Example 2:
start = 3 , size = {2,4,3} , strides = {19,4,1} Input : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 Output: 3 4 5 7 8 9 11 12 13 15 16 17 19 20 21 22 Explanation : 3 + 0*19 + 0*4 + 0*1 = 3, 3 + 0*19 + 0*4 + 1*1 = 4, 3 + 0*19 + 0*4 + 2*1 = 5, 3 + 0*19 + 1*4 + 0*1 = 7, 3 + 0*19 + 1*4 + 1*1 = 8, ... ... 3 + 1*19 + 0*4 + 0*1 = 22
Example 2: Demonstrates the use of gslices to address columns of a 3D array and perform some operations.
< div id= "highlighter_926772" class = "syntaxhighlighter nogutter " ><table border= "0" cellpadding= "0" cellspacing= "0" ><tbody><tr><td class = "code" >< div class = "container" >< div class = "line number1 index0 alt2" ><code class = "comments" > // C++ Program to demonstrate use of</code></div><div class="line number2 index1 alt1"><code class="comments">// gslice to address columns of 3D array</code></div><div class="line number3 index2 alt2"><code class="preprocessor">#include <iostream> // std::cout</code></div><div class="line number4 index3 alt1"><code class="preprocessor">#include <valarray> // std::gslice</code></div><div class="line number5 index4 alt2"><code class="keyword bold">void</code> <code class="plain">test_print(std::valarray<</code><code class="color1 bold">int</code><code class="plain">>& v, </code><code class="color1 bold">int</code> <code class="plain">rows, </code><code class="color1 bold">int</code> <code class="plain">cols,</code></div><div class="line number6 index5 alt1"><code class="undefined spaces"> </code><code class="color1 bold">int</code> <code class="plain">planes)</code></div><div class="line number7 index6 alt2"><code class="plain">{</code></div><div class="line number8 index7 alt1"><code class="undefined spaces"> </code><code class="keyword bold">for</code> <code class="plain">(</code><code class="color1 bold">int</code> <code class="plain">r = 0; r < rows; ++r) {</code></div><div class="line number9 index8 alt2"><code class="undefined spaces"> </code><code class="keyword bold">for</code> <code class="plain">(</code><code class="color1 bold">int</code> <code class="plain">c = 0; c < cols; ++c) {</code></div><div class="line number10 index9 alt1"><code class="undefined spaces"> </code><code class="keyword bold">for</code> <code class="plain">(</code><code class="color1 bold">int</code> <code class="plain">z = 0; z < planes; ++z)</code></div><div class="line number11 index10 alt2"><code class="undefined spaces"> </code><code class="plain">std::cout</code></div><div class="line number12 index11 alt1"><code class="undefined spaces"> </code><code class="plain"><< v[r * cols * planes + c * planes + z]</code></div><div class="line number13 index12 alt2"><code class="undefined spaces"> </code><code class="plain"><< </code><code class="string">' '</code><code class="plain">;</code></div><div class="line number14 index13 alt1"><code class="undefined spaces"> </code><code class="plain">std::cout << </code><code class="string">'\n'</code><code class="plain">;</code></div><div class="line number15 index14 alt2"><code class="undefined spaces"> </code><code class="plain">}</code></div><div class="line number16 index15 alt1"><code class="undefined spaces"> </code><code class="plain">std::cout << </code><code class="string">'\n'</code><code class="plain">;</code></div><div class="line number17 index16 alt2"><code class="undefined spaces"> </code><code class="plain">}</code></div><div class="line number18 index17 alt1"><code class="plain">}</code></div><div class="line number19 index18 alt2"> </div><div class="line number20 index19 alt1"><code class="comments">// Driver Code</code></div><div class="line number21 index20 alt2"><code class="color1 bold">int</code> <code class="plain">main()</code></div><div class="line number22 index21 alt1"><code class="plain">{</code></div><div class="line number23 index22 alt2"><code class="undefined spaces"> </code><code class="comments">// 3d array: 2 x 4 x 3 elements</code></div><div class="line number24 index23 alt1"><code class="undefined spaces"> </code><code class="plain">std::valarray<</code><code class="color1 bold">int</code><code class="plain">> v</code></div><div class="line number25 index24 alt2"><code class="undefined spaces"> </code><code class="plain">= { 111, 112, 113, 121, 122, 123, 131, 132,</code></div><div class="line number26 index25 alt1"><code class="undefined spaces"> </code><code class="plain">133, 141, 142, 143, 211, 212, 213, 221,</code></div><div class="line number27 index26 alt2"><code class="undefined spaces"> </code><code class="plain">222, 223, 231, 232, 233, 241, 242, 243 };</code></div><div class="line number28 index27 alt1"> </div><div class="line number29 index28 alt2"><code class="undefined spaces"> </code><code class="comments">// int ar3D [2][4][3]</code></div><div class="line number30 index29 alt1"><code class="undefined spaces"> </code><code class="plain">std::cout << </code><code class="string">"Initial 2x4x3 array:\n"</code><code class="plain">;</code></div><div class="line number31 index30 alt2"><code class="undefined spaces"> </code><code class="plain">test_print(v, 2, 4, 3);</code></div><div class="line number32 index31 alt1"> </div><div class="line number33 index32 alt2"><code class="undefined spaces"> </code><code class="comments">// update every value in the first columns of both</code></div><div class="line number34 index33 alt1"><code class="undefined spaces"> </code><code class="comments">// planes</code></div><div class="line number35 index34 alt2"><code class="undefined spaces"> </code><code class="plain">v[std::gslice(0, { 2, 4 }, { 4 * 3, 3 })] = 1;</code></div><div class="line number36 index35 alt1"> </div><div class="line number37 index36 alt2"><code class="undefined spaces"> </code><code class="comments">// subtract the third column from the</code></div><div class="line number38 index37 alt1"><code class="undefined spaces"> </code><code class="comments">// second column in the 1st plane</code></div><div class="line number39 index38 alt2"><code class="undefined spaces"> </code><code class="plain">v[std::gslice(1, { 1, 4 }, { 4 * 3, 3 })]</code></div><div class="line number40 index39 alt1"><code class="undefined spaces"> </code><code class="plain">-= v[std::gslice(2, { 1, 4 }, { 4 * 3, 3 })];</code></div><div class="line number41 index40 alt2"> </div><div class="line number42 index41 alt1"><code class="undefined spaces"> </code><code class="plain">std::cout << </code><code class="string">"After column operations: \n"</code><code class="plain">;</code></div><div class="line number43 index42 alt2"><code class="undefined spaces"> </code><code class="plain">test_print(v, 2, 4, 3);</code></div><div class="line number44 index43 alt1"> </div><div class="line number45 index44 alt2"><code class="undefined spaces"> </code><code class="keyword bold">return</code> <code class="plain">0;</code></div><div class="line number46 index45 alt1"><code class="plain">}</code></div></div></td></tr></tbody></table></div>
|
Initial 2x4x3 array: 111 112 113 121 122 123 131 132 133 141 142 143 211 212 213 221 222 223 231 232 233 241 242 243 After column operations: 1 -1 113 1 -1 123 1 -1 133 1 -1 143 1 212 213 1 222 223 1 232 233 1 242 243