• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3<html xmlns="http://www.w3.org/1999/xhtml">
4<head>
5<meta name="generator" content="Bluefish 2.2.10" />
6<meta http-equiv="Content-Type" content=
7"text/html; charset=us-ascii" />
8<link rel="stylesheet" href="../../../../boost.css" type="text/css"/>
9<link rel="stylesheet" href="ublas.css" type="text/css" />
10<script type="text/javascript" src="js/jquery-1.3.2.min.js" async="async" ></script>
11<script type="text/javascript" src="js/jquery.toc-gw.js" async="async" ></script>
12<script type="text/x-mathjax-config">
13MathJax.Hub.Config({
14      jax: ["input/TeX", "output/HTML-CSS"],
15      extensions: ["tex2jax.js"],
16      "HTML-CSS": { preferredFont: "TeX", availableFonts: ["STIX","TeX"], scale: "80" },
17      tex2jax: {
18      	inlineMath: [ ["$", "$"], ["\\(","\\)"] ],
19      	displayMath: [ ["$$","$$"], ["\\[", "\\]"] ],
20      	processEscapes: true,
21      	ignoreClass: "tex2jax_ignore|dno" },
22      TeX: { noUndefined: { attributes: { mathcolor: "red", mathbackground: "#FFEEEE", mathsize: "90%" } } },
23      messageStyle: "none"
24    });
25</script>
26<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js"></script>
27
28
29<title>Tensor</title>
30</head>
31<body>
32<h1><img src="../../../../boost.png" align="middle" />Tensor</h1>
33<div class="toc" id="toc"></div>
34<h2><a name="tensor"></a>Tensor</h2>
35<h4>Description</h4>
36<p>The templated class <code>tensor&lt;value_t,format_t,storage_t&gt;</code> is the base container adaptor for dense tensors.
37Every element $t_{i_1,i_2,\dots,i_p}$ of a $p$-order $(n_1 \times n_2 \times \cdots \times n_p)$-dimensional tensor $T$ is mapped to $j$-th element of a one-dimensional container where $j = \sum_{r=1}^p i_r \cdot w_r$ with $1 \leq i_r \leq n_r $ for $1 \leq r \leq p$.
38For the first-order orientation $w_1 = 1$ and $w_k = n_{k-1} \cdot w_{k-1}$ for $k > 1$. For last-order orientation $w_p = 1$ and $ w_k = n_{k+1} \cdot w_{k+1}$ for $k < p$.
39</p>
40<h4>Example</h4>
41<pre>
42<b>#include</b> &lt;boost/numeric/ublas/tensor.hpp&gt;
43
44<b>int</b> main () {
45  <b>using namespace</b> boost::numeric::ublas;
46  tensor&lt;<b>double</b>&gt; t{4,2,3};
47  <b>for</b> (<b>auto</b> k = 0ul; k &lt; t.size (2); ++ k)
48    <b>for</b> (<b>auto</b> j = 0ul; j &lt; t.size (1); ++ j)
49      <b>for</b> (<b>auto</b> i = 0ul; i &lt; t.size (0); ++ i)
50        t.at(i,j,k) = 3*i + 2*j + 5*k;
51
52  std::cout &lt;&lt; t &lt;&lt; std::endl;
53}
54</pre>
55
56<h4>Definition</h4>
57<p>Defined in the header file <code>tensor/tensor.hpp</code>.</p>
58
59<h4>Model of</h4>
60<p><a href="container_concept.html#tensor">Tensor</a></p>
61
62<h4>Type requirements</h4>
63<p>None, except for those imposed by the requirements of <a href="container_concept.html#tensor">Tensor</a> .</p>
64
65<h4>Public base classes</h4>
66<p><code>tensor_container&lt;tensor&lt;value_t,format_t,storage_t&gt; &gt;</code></p>
67
68<h4>Template parameters</h4>
69<table border="1" summary="parameters">
70<tbody>
71<tr>
72<th>Parameter</th>
73<th>Description</th>
74<th>Default</th>
75</tr>
76<tr>
77<td><code>value_t</code></td>
78<td>The type of object stored in the tensor.</td>
79<td></td>
80</tr>
81<tr>
82<td><code>format_t</code></td>
83<td>Storage organization. <a href=
84"#tensor_1">[1]</a></td>
85<td><code>first_order</code></td>
86</tr>
87<tr>
88<td><code>storage_t</code></td>
89<td>The type of the Storage array. <a href="#tensor_2">[2]</a></td>
90<td><code>std::vector&lt;value_t&gt;</code></td>
91</tr>
92</tbody>
93</table>
94
95<h4>Member types</h4>
96<table border="1" style="font-size:100%" summary="members">
97<tbody style="font-size:100%" >
98<tr>
99<th>Member type</th>
100<th>Description</th>
101</tr>
102<tr>
103<td><code>value_type</code></td>
104<td>Type <code>value_t</code> of the tensor elements.</td>
105</tr>
106<tr>
107<td><code>layout_type</code></td>
108<td>Format of the tensor which is either <code>first_order</code> or <code>last_order</code>.</td>
109</tr>
110<tr>
111<td><code>array_type</code></td>
112<td>Sequence container type that stores all tensor elements and is accessible with a single index.</td>
113</tr>
114
115<tr>
116<td><code>strides_type</code></td>
117<td>Type of the strides vector <code>basic_strides&lt;std::size_t,layout_type&gt;</code> that stores all tensor elements and is accessible with a single index.</td>
118</tr>
119
120<tr>
121<td><code>extents_type</code></td>
122<td>Type of the dimension extents vector <code>shape</code> that stores all tensor elements and is accessible with a single index.</td>
123</tr>
124
125
126<tr>
127<td><code>size_type</code></td>
128<td>Unsigned integer which is usually <code>std::size_t</code>.</td>
129</tr>
130<tr>
131<td><code>difference_type</code></td>
132<td>Unsigned integer which is usually <code>std::ptrdiff_t</code>.</td>
133</tr>
134<tr>
135<td><code>reference</code></td>
136<td>Reference type <code>storage_type::reference</code> which is in most cases <code>value_type&</code>.</td>
137</tr>
138<tr>
139<td><code>const_reference</code></td>
140<td>Constant reference type <code>storage_type::const_reference</code> which is in most cases <code>const value_type&</code>.</td>
141</tr>
142<tr>
143<td><code>pointer</code></td>
144<td>Pointer type <code>storage_type::pointer</code> which is in most cases <code>value_type*</code>.</td>
145</tr>
146<tr>
147<td><code>const_pointer</code></td>
148<td>Constant reference type <code>storage_type::const_reference</code> which is in most cases <code>const value_type*</code>.</td>
149</tr>
150<tr>
151<td><code>iterator</code></td>
152<td>RandomAccessIterator <code>storage_type::iterator</code>.</td>
153</tr>
154<tr>
155<td><code>const_iterator</code></td>
156<td>Constant RandomAccessIterator <code>storage_type::const_iterator</code>.</td>
157</tr>
158<tr>
159<td><code>reverse_iterator</code></td>
160<td>Reverse RandomAccessIterator <code>storage_type::reverse_iterator</code>.</td>
161</tr>
162<tr>
163<td><code>const_reverse_iterator</code></td>
164<td>Reverse RandomAccessIterator <code>storage_type::const_reverse_iterator</code>.</td>
165</tr>
166
167<tr>
168<td><code>matrix_type</code></td>
169<td>Type of the matrix <code>matrix&lt;value_type,layout_type,array_type&gt;</code> with which the tensor type interacts.</td>
170</tr>
171<tr>
172<td><code>vector_type</code></td>
173<td>Type of the vector <code>matrix&lt;value_type,layout_type,array_type&gt;</code> with which the tensor type interacts.</td>
174</tr>
175</tbody>
176</table>
177
178<h4>Alias templates</h4>
179<table border="1" style="font-size:100%" summary="members">
180<tbody style="font-size:100%" >
181<tr>
182<th>Alias template</th>
183<th>Description</th>
184<tr>
185<td><code>template&lt;class derived_type&gt; <br> using tensor_expression_type = detail::tensor_expression&lt;self_type,derived_type&gt;</code></td>
186<td>Type of <a href= "tensor/tensor_expression.html#tensor_expression">tensor_expression</a> where <code>self_type</code> is the <code>tensor</code> type.</td>
187</tr>
188<tr>
189<td><code>template&lt;class derived_type&gt; <br> using matrix_expression_type = matrix_expression&lt;derived_type&gt;</code></td>
190<td>Type of <a href= "matrix_expression.html#matrix_expression">matrix_expression</a>.</td>
191</tr>
192<tr>
193<td><code>template&lt;class derived_type&gt; <br> using vector_expression_type = vector_expression&lt;derived_type&gt;</code></td>
194<td>Type of <a href= "vector_expression.html#vector_expression">vector_expression</a>.</td>
195</tr>
196</tbody>
197</table>
198
199
200<h3>Member Functions</h3>
201
202<h4>Construction</h4>
203
204
205<table border="1" style="font-size:100%" summary="constructors">
206<tbody style="font-size:100%" >
207<tr>
208<th>Member function</th>
209<th>Description</th>
210</tr>
211<tr>
212<td><code>tensor ()</code></td>
213<td>Constructs an uninitialized <code>tensor</code> that holds zero elements.</td>
214</tr>
215<tr>
216<td><code> tensor (std::initializer_list&lt;size_type&gt; list) </code></td>
217<td>Constructs an uninitialized <code>tensor</code> where <code>list</code> specifies the dimension <a href="tensor/extents.html">extents</a>.</td>
218</tr>
219<tr>
220<td><code> tensor (extents_type const& s) </code></td>
221<td>Constructs an uninitialized <code>tensor</code> where
222<code>s</code> specifies the dimension <a href="tensor/extents.html">extents</a>.</td>
223</tr>
224<tr>
225<td><code> tensor (extents_type const& e, array_type const& a) </code></td>
226<td>Constructs an uninitialized <code>tensor</code> where
227<code>e</code> specifies the dimension <a href="tensor/extents.html">extents</a> and <code>a</code> the data elements of the tensor.</td>
228</tr>
229
230<tr>
231<td><code>tensor (tensor&lt;value_type,other_layout&rt; const& other)</code></td>
232<td>Constructs tensor by copying elements from <code>other</code> where the layout is different from this layout type.</td>
233</tr>
234
235<tr>
236<td><code>tensor (tensor const& other)</code></td>
237<td>Constructs tensor by copying elements from <code>other</code>.</td>
238</tr>
239
240<tr>
241<td><code>tensor (tensor && other)</code></td>
242<td>Constructs tensor by moving elements from <code>other</code>.</td>
243</tr>
244
245<tr>
246<td><code>tensor (matrix_type const& other)</code></td>
247<td>Constructs tensor by copying elements from <code>other</code> <a href="matrix.html">matrix</a>. The tensor will have the order 2.</td>
248</tr>
249<tr>
250<td><code>tensor (matrix_type && other)</code></td>
251<td>Constructs tensor by moving elements from <code>other</code> <a href="matrix.html">matrix</a>. The tensor will have the order 2.</td>
252</tr>
253
254<tr>
255<td><code>tensor (vector_type const& other)</code></td>
256<td>Constructs tensor by copying elements from <code>other</code> <a href="vector.html">vector</a>. The tensor will have the order 1.</td>
257</tr>
258<tr>
259<td><code>tensor (vector_type && other)</code></td>
260<td>Constructs tensor by moving elements from <code>other</code> <a href="vector.html">vector</a>. The tensor will have the order 1.</td>
261</tr>
262
263<tr>
264<td><code>tensor (tensor_expression_type&lt;derived_type&gt; const& expr)</code></td>
265<td>Constructs tensor by evaluating the <a href="tensor/tensor_expression.html">tensor expression</a> <code>expr</code> and copying all elements of the result.</td>
266</tr>
267
268<tr>
269<td><code>tensor (matrix_expression_type&lt;derived_type&gt; const& expr)</code></td>
270<td>Constructs tensor by evaluating the <a href="matrix_expression.html">matrix expression</a> <code>expr</code> and copying all elements of the result.</td>
271</tr>
272
273<tr>
274<td><code>tensor (vector_expression_type&lt;derived_type&gt; const& expr)</code></td>
275<td>Constructs tensor by evaluating the <a href="vector_expression.html">vector expression</a> <code>expr</code> and copying all elements of the result.</td>
276</tr>
277
278</tbody>
279</table>
280<!-------------------------------------------->
281
282<h4>Assignment</h4>
283
284
285<table border="1" style="font-size:100%" summary="constructors">
286<tbody style="font-size:100%" >
287<tr>
288<th>Member function</th>
289<th>Description</th>
290</tr>
291<tr>
292<td><code>tensor& operator=(tensor_expression_type&lt;derived_type&gt; const& expr)</code></td>
293<td>Evaluates the <a href="tensor/tensor_expression.html">tensor expression</a> <code>expr</code> and copyies all elements of the result.</td>
294</tr>
295
296<tr>
297<td><code>tensor& operator=(tensor other)</code></td>
298<td>Copies or moves elements of <code>other</code>.</td>
299</tr>
300
301<tr>
302<td><code>tensor& operator=(const_reference v)</code></td>
303<td>Initialiates all elements of a tensor with <code>v</code>.</td>
304</tr>
305</tbody>
306</table>
307<!-------------------------------------------->
308
309<h4>Capacity</h4>
310
311<table border="1" style="font-size:100%" summary="capacity">
312<tbody style="font-size:100%" >
313<tr>
314<th>Member function</th>
315<th>Description</th>
316</tr>
317<tr>
318<td><code>bool empty() const</code></td>
319<td>Returns true if a tensor has zero elements.</td>
320</tr>
321
322<tr>
323<td><code>size_type size() const</code></td>
324<td>Returns the number of elements of the tensor.</td>
325</tr>
326
327<tr>
328<td><code>size_type rank() const</code></td>
329<td>Returns the number of dimensions of the tensor.</td>
330</tr>
331
332<tr>
333<td><code>size_type order() const</code></td>
334<td>Returns the number of dimensions of the tensor.</td>
335</tr>
336
337<tr>
338<td><code>strides_type const& strides() const</code></td>
339<td>Returns a constant reference to the <a href="tensor/strides.html">strides</a> of the tensor.</td>
340</tr>
341
342<tr>
343<td><code>extents_type const& extents() const</code></td>
344<td>Returns a constant reference to the <a href="tensor/extents.html">extents</a> of the tensor.</td>
345</tr>
346</tbody>
347</table>
348
349<!-------------------------------------------->
350
351<h4>Element access</h4>
352
353<table border="1" style="font-size:100%" summary="capacity">
354<tbody style="font-size:100%" >
355<tr>
356<th>Member function</th>
357<th>Description</th>
358</tr>
359
360<tr>
361<td><code>pointer data()</code></td>
362<td>Returns a <code>pointer</code> the first element of the tensor.</td>
363</tr>
364
365<tr>
366<td><code>const_pointer data() const</code></td>
367<td>Returns a <code>const_pointer</code> the first element of the tensor.</td>
368</tr>
369
370<tr>
371<td><code>reference operator[](size_type j)</code></td>
372<td>Returns a <code>reference</code> to the <code>j</code>-th element of the storage array of the tensor. Corresponds to the function call <code>tensor::data()+j</code></td>
373</tr>
374
375<tr>
376<td><code>const_reference operator[](size_type j) const</code></td>
377<td>Returns a <code>const_reference</code> to the <code>j</code>-th element of the storage array of the tensor. Corresponds to the function call <code>tensor::data()+j</code>.</td>
378</tr>
379
380
381<tr>
382<td><code>template&lt;class ... size_types&gt; <br> reference at(size_type i, size_types ... is)</code></td>
383<td>Returns a <code>reference</code> to the <code>(i,is...)</code>-th element of the tensor where <code> (i,is...)</code> denotes a multi-index with <code>tensor::order()</code> elements. If <code>sizeof...(is)==0</code>, <code>tensor::operator[i]</code> is called. </td>
384</tr>
385
386<tr>
387<td><code>template&lt;class ... size_types&gt; <br> const_reference at(size_type i, size_types ... is)</code></td>
388<td>Returns a <code>const_reference</code> to the <code>(i,is...)</code>-th element of the tensor where <code> (i,is...)</code> denotes a multi-index with <code>tensor::order()</code> elements. If <code>sizeof...(is)==0</code>, <code>tensor::operator[i]</code> is called. </td>
389</tr>
390
391</tbody>
392</table>
393
394
395<!-------------------------------------------->
396
397<h4>Proxy Generation</h4>
398
399<table border="1" style="font-size:100%" summary="capacity">
400<tbody style="font-size:100%" >
401<tr>
402<th>Member function</th>
403<th>Description</th>
404</tr>
405
406<tr>
407<td><code>template&lt;std::size_t I, class ... index_types&gt; <br> tensor_index operator()(indices::Index&lt;I&gt; p, index_types ... ps)</code></td>
408<td>Returns a <a href="tensor/tensor_index.html">tensor index</a> instance with index objects <code>(p,ps...)</code> for a tensor contraction where <code>sizeof...(ps)+1</code> must be equal to <code>tensor::order()</code>.</td>
409</tr>
410
411</tbody>
412</table>
413
414
415<h4>Iterators</h4>
416
417<table border="1" style="font-size:100%" summary="iterators">
418<tbody style="font-size:100%" >
419<tr>
420<th>Member function</th>
421<th>Description</th>
422</tr>
423
424<tr>
425<td><code>const_iterator begin() const</code></td>
426<td>Returns a const_iterator pointing to the first element of the tensor.</td>
427</tr>
428
429<tr>
430<td><code>const_iterator cbegin() const</code></td>
431<td>Returns a const_iterator pointing to the first element of the tensor.</td>
432</tr>
433
434<tr>
435<td><code>iterator begin()</code></td>
436<td>Returns an iterator pointing to the first element of the tensor.</td>
437</tr>
438
439
440<tr>
441<td><code>const_iterator end() const</code></td>
442<td>Returns a const_iterator pointing to the position after the last element of the tensor.</td>
443</tr>
444
445<tr>
446<td><code>const_iterator cend() const</code></td>
447<td>Returns a const_iterator pointing to the position after the last element of the tensor.</td>
448</tr>
449
450<tr>
451<td><code>iterator begin()</code></td>
452<td>Returns an iterator pointing to the position after the last element of the tensor.</td>
453</tr>
454
455</tbody>
456</table>
457
458
459<h4>Modifiers</h4>
460
461<table border="1" style="font-size:100%" summary="modifiers">
462<tbody style="font-size:100%" >
463<tr>
464<th>Member function</th>
465<th>Description</th>
466</tr>
467
468<tr>
469<td><code>void reshape(extents_type const& e, value_type v = value_type{})</code></td>
470<td>Reshapes the tensor according to the extents <code>e</code>. If <code>e.product()</code> is greater than <code>tensor::size()</code>, the tensor is resized with <code>v</code>. </td>
471</tr>
472
473</tbody>
474</table>
475
476
477<h4>Notes</h4>
478<p><a name="tensor_1">[1]</a> Supported parameters
479for the storage organization are <code>first_order</code> and
480<code>last_order</code>.</p>
481<p><a name="tensor_2">[2]</a> Common parameters
482for the storage array are <code>std::array&lt;N,T&gt;</code> and
483<code>std::vector&lt;T&gt;</code>.</p>
484<!-- ----------------------------------------------------
485<h2><a name="identity_tensor"></a>Identity Tensor</h2>
486<h4>Description</h4>
487<p>The templated class <code>identity_tensor&lt;T, ALLOC&gt;</code>
488represents identity matrices. For a <em>(m x n</em>)-dimensional
489identity tensor and <em>0 &lt;= i &lt; m</em>, <em>0 &lt;= j &lt;
490n</em> holds <em>id</em><sub><em>i, j</em></sub> <em>= 0</em>, if
491<em>i &lt;&gt; j</em>, and <em>id</em><sub><em>i, i</em></sub><em>=
4921</em>.</p>
493<h4>Example</h4>
494<pre>
495#include &lt;boost/numeric/ublas/tensor.hpp&gt;
496#include &lt;boost/numeric/ublas/io.hpp&gt;
497
498int main () {
499    using namespace boost::numeric::ublas;
500    identity_tensor&lt;double&gt; m (3);
501    std::cout &lt;&lt; m &lt;&lt; std::endl;
502}
503</pre>
504<h4>Definition</h4>
505<p>Defined in the header tensor.hpp.</p>
506<h4>Template parameters</h4>
507<table border="1" summary="parameters">
508<tbody>
509<tr>
510<th>Parameter</th>
511<th>Description</th>
512<th>Default</th>
513</tr>
514<tr>
515<td><code>T</code></td>
516<td>The type of object stored in the tensor.</td>
517<td><code>int</code></td>
518</tr>
519<tr>
520<td><code>ALLOC</code></td>
521<td>An STL Allocator for size_type and difference_type.</td>
522<td>std::allocator</td>
523</tr>
524</tbody>
525</table>
526<h4>Model of</h4>
527<p><a href="container_concept.html#tensor">Tensor</a> .</p>
528<h4>Type requirements</h4>
529<p>None, except for those imposed by the requirements of
530<a href="container_concept.html#tensor">Tensor</a> .</p>
531<h4>Public base classes</h4>
532<p><code>tensor_container&lt;identity_tensor&lt;T&gt;
533&gt;</code></p>
534<h4>Members</h4>
535<table border="1" summary="members">
536<tbody>
537<tr>
538<th>Member</th>
539<th>Description</th>
540</tr>
541<tr>
542<td><code>identity_tensor ()</code></td>
543<td>Constructs an <code>identity_tensor</code> that holds zero rows
544of zero elements.</td>
545</tr>
546<tr>
547<td><code>identity_tensor (size_type size)</code></td>
548<td>Constructs an <code>identity_tensor</code> that holds
549<code>size</code> rows of <code>size</code> elements.</td>
550</tr>
551<tr>
552<td><code>identity_tensor (const identity_tensor
553&amp;m)</code></td>
554<td>The copy constructor.</td>
555</tr>
556<tr>
557<td><code>void resize (size_type size, bool preserve =
558true)</code></td>
559<td>Resizes a <code>identity_tensor</code> to hold
560<code>size</code> rows of <code>size</code> elements. Therefore the
561existing elements of the <code>itendity_tensor</code> are always
562preseved.</td>
563</tr>
564<tr>
565<td><code>size_type size1 () const</code></td>
566<td>Returns the number of rows.</td>
567</tr>
568<tr>
569<td><code>size_type size2 () const</code></td>
570<td>Returns the number of columns.</td>
571</tr>
572<tr>
573<td><code>const_reference operator () (size_type i, size_type j)
574const</code></td>
575<td>Returns the value of the <code>j</code>-th element in the
576<code>i</code>-th row.</td>
577</tr>
578<tr>
579<td><code>identity_tensor &amp;operator = (const identity_tensor
580&amp;m)</code></td>
581<td>The assignment operator.</td>
582</tr>
583<tr>
584<td><code>identity_tensor &amp;assign_temporary (identity_tensor
585&amp;m)</code></td>
586<td>Assigns a temporary. May change the identity tensor
587<code>m</code> .</td>
588</tr>
589<tr>
590<td><code>void swap (identity_tensor &amp;m)</code></td>
591<td>Swaps the contents of the identity matrices.</td>
592</tr>
593<tr>
594<td><code>const_iterator1 begin1 () const</code></td>
595<td>Returns a <code>const_iterator1</code> pointing to the
596beginning of the <code>identity_tensor</code>.</td>
597</tr>
598<tr>
599<td><code>const_iterator1 end1 () const</code></td>
600<td>Returns a <code>const_iterator1</code> pointing to the end of
601the <code>identity_tensor</code>.</td>
602</tr>
603<tr>
604<td><code>const_iterator2 begin2 () const</code></td>
605<td>Returns a <code>const_iterator2</code> pointing to the
606beginning of the <code>identity_tensor</code>.</td>
607</tr>
608<tr>
609<td><code>const_iterator2 end2 () const</code></td>
610<td>Returns a <code>const_iterator2</code> pointing to the end of
611the <code>identity_tensor</code>.</td>
612</tr>
613<tr>
614<td><code>const_reverse_iterator1 rbegin1 () const</code></td>
615<td>Returns a <code>const_reverse_iterator1</code> pointing to the
616beginning of the reversed <code>identity_tensor</code>.</td>
617</tr>
618<tr>
619<td><code>const_reverse_iterator1 rend1 () const</code></td>
620<td>Returns a <code>const_reverse_iterator1</code> pointing to the
621end of the reversed <code>identity_tensor</code>.</td>
622</tr>
623<tr>
624<td><code>const_reverse_iterator2 rbegin2 () const</code></td>
625<td>Returns a <code>const_reverse_iterator2</code> pointing to the
626beginning of the reversed <code>identity_tensor</code>.</td>
627</tr>
628<tr>
629<td><code>const_reverse_iterator2 rend2 () const</code></td>
630<td>Returns a <code>const_reverse_iterator2</code> pointing to the
631end of the reversed <code>identity_tensor</code>.</td>
632</tr>
633</tbody>
634</table>
635----------------------------------------------------
636-->
637<hr/>
638<p>Copyright (&copy;) 2018 Cem Bassoy<br />
639   Use, modification and distribution are subject to the
640   Boost Software License, Version 1.0.
641   (See accompanying file LICENSE_1_0.txt
642   or copy at <a href="http://www.boost.org/LICENSE_1_0.txt">
643      http://www.boost.org/LICENSE_1_0.txt
644   </a>).
645</p>
646<script type="text/javascript">
647(function($) {
648    $('#toc').toc();
649})(jQuery);
650</script>
651</body>
652</html>
653