diff options
Diffstat (limited to 'doc/C03_TutorialArrayClass.dox')
-rw-r--r-- | doc/C03_TutorialArrayClass.dox | 242 |
1 files changed, 86 insertions, 156 deletions
diff --git a/doc/C03_TutorialArrayClass.dox b/doc/C03_TutorialArrayClass.dox index 4e3b4b08e..57ec64219 100644 --- a/doc/C03_TutorialArrayClass.dox +++ b/doc/C03_TutorialArrayClass.dox @@ -1,6 +1,6 @@ namespace Eigen { -/** \page TutorialArrayClass Tutorial page 3 - The %Array class +/** \page TutorialArrayClass Tutorial page 3 - The %Array class and coefficient-wise operations \ingroup Tutorial \li \b Previous: \ref TutorialMatrixArithmetic @@ -10,129 +10,130 @@ This tutorial aims to provide an overview and explanations on how to use Eigen's \link ArrayBase Array \endlink class \b Table \b of \b contents - - \ref TutorialArrayClassWhatIs - - \ref TutorialArrayClassTypes - - \ref TutorialArrayClassAccess - - \ref TutorialArrayClassCoeffWiseOperations - - \ref TutorialArrayHowToUse - - \ref TutorialArrayClassCoeffWiseOperators - -\section TutorialArrayClassWhatIs What is the Array class? -The \link ArrayBase Array \endlink class provides general-purpose arrays, as opposed to the Matrix class which -is intended for doing linear algebra. Furthermore, the \link ArrayBase Array \endlink class provides an easy way to -perform coefficient-wise operations, which might not have a precise meaning in linear matrix algebra, + - \ref TutorialArrayClassIntro + - \ref TutorialArrayClassTypes + - \ref TutorialArrayClassAccess + - \ref TutorialArrayClassAddSub + - \ref TutorialArrayClassMult + - \ref TutorialArrayClassConvert + +\section TutorialArrayClassIntro What is the Array class? + +The Array class provides general-purpose arrays, as opposed to the Matrix class which +is intended for linear algebra. Furthermore, the Array class provides an easy way to +perform coefficient-wise operations, which might not have a linear algebraic meaning, such as adding a constant to every coefficient in the array or multiplying two arrays coefficient-wise. -\subsection TutorialArrayClassTypes Array type and predefined types -The \link ArrayBase Array \endlink class is actually a template that works in a similar way as the \b Matrix one: - +\section TutorialArrayClassTypes Array types +Array is a class template taking the same template parameters as Matrix. +As with with, the first 3 template parameters are mandatory: \code - -//declaring an Array instance -Array<type,numRows,numCols> a; +Array<typename Scalar, int RowsAtCompileTime, int ColsAtCompileTime> \endcode +And the last 3 template parameters are optional. Since this is exactly the same as for Matrix, +we won't reexplain it and just refer to \ref TutorialMatrixClass "this page". -Eigen provides a bunch of predefined types to make instantiation easier. These types follow the same -conventions as the ones available for the \b Matrix ones but with some slight differences, -as shown in the following table: - -FIXME: explain why these differences- +Eigen also provides typedefs for some common cases, in a way that is similar to the Matrix typedefs +but with some slight differences, as the word "array" is used for both 1-dimensional and 2-dimensional arrays. +We adopt that convention that typedefs of the form ArrayNt stand for 1-dimensional arrays, where N and t are +as in the Matrix typedefs explained on \ref TutorialMatrixClass "this page". For 2-dimensional arrays, we +use typedefs of the form ArrayNNt. Some examples are shown in the following table: <table class="tutorial_code" align="center"> -<tr><td align="center">\b Type</td><td align="center">\b Typedef</td></tr> -<tr><td> -\code Array<double,Dynamic,Dynamic> \endcode</td> -<td> -\code ArrayXXd \endcode</td></tr> -<tr><td> -\code Array<double,3,3> \endcode</td> -<td> -\code Array33d \endcode</td></tr> -<tr><td> -\code Array<float,Dynamic,Dynamic> \endcode</td> -<td> -\code ArrayXXf \endcode</td></tr> -<tr><td> -\code Array<float,3,3> \endcode</td> -<td> -\code Array33f \endcode</td></tr> -</table> + <tr> + <td align="center">\b Type </td> + <td align="center">\b Typedef </td> + </tr> -\subsection TutorialArrayClassAccess Accessing values inside an Array -Write and read-access to coefficients inside \link ArrayBase Array \endlink is done in the same way as with \b Matrix. -Here some examples are presented, just for clarification: + <tr> + <td> \code Array<float,Dynamic,1> \endcode </td> + <td> \code ArrayXf \endcode </td> + </tr> -\include Tutorial_ArrayClass_accessing.cpp - -Output: -\verbinclude Tutorial_ArrayClass_accessing.out - -For more information about the comma initializer, refer to \ref TutorialAdvancedInitialization "this page". + <tr> + <td> \code Array<float,3,1> \endcode </td> + <td> \code Array3f \endcode </td> + </tr> + <tr> + <td> \code Array<double,Dynamic,Dynamic> \endcode </td> + <td> \code ArrayXXd \endcode </td> + </tr> + <tr> + <td> \code Array<double,3,3> \endcode </td> + <td> \code Array33d \endcode </td> + </tr> +</table> +\section TutorialArrayClassAccess Accessing values inside an Array +Write and read access to coefficients of an array expression is done in the same way as with matrix expressions. +For example: +\include Tutorial_ArrayClass_accessors.cpp +Output: +\verbinclude Tutorial_ArrayClass_accessors.out +For more information about the comma initializer, refer to \ref TutorialAdvancedInitialization "this page". -\section TutorialArrayClassCoeffWiseOperations Coefficient-wise operators +\section TutorialArrayClassAddSub Addition and substraction -\subsection TutorialArrayClassCoeffWiseAdd Coefficient-wise addition -Adding two \link ArrayBase Array \endlink objects has the same result as adding to Matrices, performing coefficient-wise addition. This is valid as long as both arrays have the same dimensions: +Adding and substracting two arrays has the same result as for Matrices. +This is valid as long as both arrays have the same sizes: \include Tutorial_ArrayClass_addition.cpp - Output: \verbinclude Tutorial_ArrayClass_addition.out -The addition operator can also be used to add a scalar to each coefficient in an Array, providing a functionality that was not available for Matrix objects: +It is also allowed to add a scalar to each coefficient in an Array, +providing a functionality that was not available for Matrix objects: \include Tutorial_ArrayClass_addition_scalar.cpp - Output: \verbinclude Tutorial_ArrayClass_addition_scalar.out +\subsection TutorialArrayClassMult Array multiplication - -\subsection TutorialArrayClassCoeffWiseMult Coefficient-wise multiplication - -As said before, the \link ArrayBase Array \endlink class looks at operators from a coefficient-wise perspective. -This makes an important difference with respect to \b Matrix algebraic operations, especially -with the product operator. The following example performs coefficient-wise multiplication between two array instances: +First of all, of course you can multiply an array by a scalar, this works in the same way as matrices. Where arrays +are fundamentally different from matrices, is when you multiply two arrays together. While Matrices interprete +multiplication as matrix product, arrays interprete multiplication as coefficient-wise product. For example: \include Tutorial_ArrayClass_mult.cpp - Output: \verbinclude Tutorial_ArrayClass_mult.out -\section TutorialArrayHowToUse Using arrays and matrices -It is possible to treat the data inside a \b Matrix object as an \link ArrayBase Array \endlink -and vice-versa. This allows the developer to perform a wide diversity of operators regardless -of the actual type where the coefficients rely on. +\section TutorialArrayClassConvert Converting between array and matrix expressions + +It is possible to wrap a matrix expression as an array expression and conversely. This gives access to all operations +regardless of the choice of declaring objects as arrays or as matrices. + +\link MatrixBase Matrix expressions \endlink have a \link MatrixBase::array() .array() \endlink method that +'converts' them into \link ArrayBase array expressions \endlink, so that coefficient-wise operations +can be applied easily. Conversely, \link ArrayBase array expressions \endlink +have a \link ArrayBase::matrix() .matrix() \endlink method. As with all Eigen expression abstractions, +this doesn't have any runtime cost (provided that you let your compiler optimize). -The \b Matrix class provides a \link MatrixBase::array() .array() \endlink method that -'converts' it into an \link ArrayBase Array \endlink type, so that coefficient-wise operations -can be applied easily. On the other side, the \link ArrayBase Array \endlink -class provides a \link ArrayBase::matrix() .matrix() \endlink method. FIXME: note on overhead? Both \link MatrixBase::array() .array() \endlink and \link ArrayBase::matrix() .matrix() \endlink -can be used as \b rvalues or \b lvalues in expressions. +can be used as \b rvalues and as \b lvalues. -<b>IMPORTANT NOTE:</b> Mixing matrices and arrays in an expression is forbidden with Eigen. However, +Mixing matrices and arrays in an expression is forbidden with Eigen. However, it is easy to convert from one to the other with \link MatrixBase::array() .array() \endlink and -\link ArrayBase::matrix() .matrix() \endlink. Conversely, assigning a Matrix to an -\link ArrayBase Array \endlink or vice-versa is allowed. +\link ArrayBase::matrix() .matrix() \endlink. -\subsection TutorialArrayInteropMatrix Matrix to array example -The following example shows how to use Array operations with a Matrix object by employing -the \link MatrixBase::array() .array() \endlink function: +On the other hand, assigning a matrix expression to an array expression is allowed. + +\subsection TutorialArrayClassInteropMatrix Matrix to array example +The following example shows how to use array operations on a Matrix object by employing +the \link MatrixBase::array() .array() \endlink method: <table class="tutorial_code"><tr><td> \include Tutorial_ArrayClass_interop_matrix.cpp @@ -143,9 +144,9 @@ Output: </td></tr></table> -\subsection TutorialArrayInteropArray Array to matrix example -The following example shows how to use Matrix operations with an \link ArrayBase Array \endlink -object by employing the \link ArrayBase::matrix() .matrix() \endlink function: +\subsection TutorialArrayClassInteropArray Array to matrix example +The following example shows how to use matrix operations with an Array +object by employing the \link ArrayBase::matrix() .matrix() \endlink method: <table class="tutorial_code"><tr><td> \include Tutorial_ArrayClass_interop_array.cpp @@ -155,8 +156,8 @@ Output: \verbinclude Tutorial_ArrayClass_interop_array.out </td></tr></table> -\subsection TutorialArrayInteropCombination Example with combinations of .array() and .matrix() -Here there is a more advanced example: +\subsection TutorialArrayClassInteropCombination Example with combinations of .array() and .matrix() +Here is a more advanced example: <table class="tutorial_code"><tr><td> \include Tutorial_ArrayClass_interop.cpp @@ -166,79 +167,8 @@ Output: \verbinclude Tutorial_ArrayClass_interop.out </td></tr></table> - -\b NOTE: there is no need to call \link ArrayBase::matrix() .matrix() \endlink to assign a -\link ArrayBase Array \endlink type to a \b Matrix or vice-versa. - -\section TutorialArrayClassCoeffWiseOperators Array coefficient-wise operators - -FIXME: move to reference table? (I think it is already there) - -<table class="noborder"> -<tr><td> -<table class="tutorial_code" style="margin-right:10pt"> -<tr><td>Coefficient wise \link ArrayBase::operator*() product \arrayworld \endlink</td> -<td>\code array3 = array1 * array2; \endcode -</td></tr> -<tr><td> -Add a scalar to all coefficients</td><td>\code -array3 = array1 + scalar; -array3 += scalar; -array3 -= scalar; -\endcode -</td></tr> -<tr><td> -Coefficient wise \link ArrayBase::operator/() division \endlink \arrayworld</td><td>\code -array3 = array1 / array2; \endcode -</td></tr> -<tr><td> -Coefficient wise \link ArrayBase::inverse() reciprocal \endlink \arrayworld</td><td>\code -array3 = array1.inverse(); \endcode -</td></tr> -<tr><td> -Coefficient wise comparisons \arrayworld \n -(support all operators)</td><td>\code -array3 = array1 < array2; -array3 = array1 <= array2; -array3 = array1 > array2; -etc. -\endcode -</td></tr></table> -</td> -<td><table class="tutorial_code"> -<tr><td> -\b Trigo \arrayworld: \n -\link ArrayBase::sin sin \endlink, \link ArrayBase::cos cos \endlink</td><td>\code -array3 = array1.sin(); -etc. -\endcode -</td></tr> -<tr><td> -\b Power \arrayworld: \n \link ArrayBase::pow() pow \endlink, -\link ArrayBase::square square \endlink, -\link ArrayBase::cube cube \endlink, \n -\link ArrayBase::sqrt sqrt \endlink, -\link ArrayBase::exp exp \endlink, -\link ArrayBase::log log \endlink </td><td>\code -array3 = array1.square(); -array3 = array1.pow(5); -array3 = array1.log(); -etc. -\endcode -</td></tr> -<tr><td> -\link ArrayBase::min min \endlink, \link ArrayBase::max max \endlink, \n -absolute value (\link ArrayBase::abs() abs \endlink, \link ArrayBase::abs2() abs2 \endlink \arrayworld) -</td><td>\code -array3 = array1.min(array2); -array3 = array1.max(array2); -array3 = array1.abs(); -array3 = array1.abs2(); -\endcode</td></tr> -</table> -</td></tr></table> - \li \b Next: \ref TutorialBlockOperations -**/ +*/ + } |