Austin Schuh | 189376f | 2018-12-20 22:11:15 +1100 | [diff] [blame^] | 1 | namespace Eigen { |
| 2 | |
| 3 | /** \eigenManualPage TutorialReshapeSlicing Reshape and Slicing |
| 4 | |
| 5 | %Eigen does not expose convenient methods to take slices or to reshape a matrix yet. |
| 6 | Nonetheless, such features can easily be emulated using the Map class. |
| 7 | |
| 8 | \eigenAutoToc |
| 9 | |
| 10 | \section TutorialReshape Reshape |
| 11 | |
| 12 | A reshape operation consists in modifying the sizes of a matrix while keeping the same coefficients. |
| 13 | Instead of modifying the input matrix itself, which is not possible for compile-time sizes, the approach consist in creating a different \em view on the storage using class Map. |
| 14 | Here is a typical example creating a 1D linear view of a matrix: |
| 15 | |
| 16 | <table class="example"> |
| 17 | <tr><th>Example:</th><th>Output:</th></tr> |
| 18 | <tr><td> |
| 19 | \include Tutorial_ReshapeMat2Vec.cpp |
| 20 | </td> |
| 21 | <td> |
| 22 | \verbinclude Tutorial_ReshapeMat2Vec.out |
| 23 | </td></tr></table> |
| 24 | |
| 25 | Remark how the storage order of the input matrix modifies the order of the coefficients in the linear view. |
| 26 | Here is another example reshaping a 2x6 matrix to a 6x2 one: |
| 27 | <table class="example"> |
| 28 | <tr><th>Example:</th><th>Output:</th></tr> |
| 29 | <tr><td> |
| 30 | \include Tutorial_ReshapeMat2Mat.cpp |
| 31 | </td> |
| 32 | <td> |
| 33 | \verbinclude Tutorial_ReshapeMat2Mat.out |
| 34 | </td></tr></table> |
| 35 | |
| 36 | |
| 37 | |
| 38 | \section TutorialSlicing Slicing |
| 39 | |
| 40 | Slicing consists in taking a set of rows, columns, or elements, uniformly spaced within a matrix. |
| 41 | Again, the class Map allows to easily mimic this feature. |
| 42 | |
| 43 | For instance, one can skip every P elements in a vector: |
| 44 | <table class="example"> |
| 45 | <tr><th>Example:</th><th>Output:</th></tr> |
| 46 | <tr><td> |
| 47 | \include Tutorial_SlicingVec.cpp |
| 48 | </td> |
| 49 | <td> |
| 50 | \verbinclude Tutorial_SlicingVec.out |
| 51 | </td></tr></table> |
| 52 | |
| 53 | One can olso take one column over three using an adequate outer-stride or inner-stride depending on the actual storage order: |
| 54 | <table class="example"> |
| 55 | <tr><th>Example:</th><th>Output:</th></tr> |
| 56 | <tr><td> |
| 57 | \include Tutorial_SlicingCol.cpp |
| 58 | </td> |
| 59 | <td> |
| 60 | \verbinclude Tutorial_SlicingCol.out |
| 61 | </td></tr></table> |
| 62 | |
| 63 | */ |
| 64 | |
| 65 | } |