2010-06-26 08:16:12 +08:00
namespace Eigen {
2010-06-27 02:00:00 +08:00
/** \page TutorialArrayClass Tutorial page 3 - The Array Class
2010-06-26 08:16:12 +08:00
\ingroup Tutorial
2010-06-27 02:00:00 +08:00
\li \b Previous: \ref TutorialMatrixArithmetic
2010-06-29 01:42:09 +08:00
\li \b Next: \ref TutorialBlockOperations
2010-06-27 02:00:00 +08:00
2010-06-29 01:42:09 +08:00
This tutorial aims to provide an overview and explanations on how to use
Eigen's \link ArrayBase Array \endlink class
2010-06-26 08:16:12 +08:00
\b Table \b of \b contents
- \ref TutorialArrayClassWhatIs
- \ref TutorialArrayClassTypes
- \ref TutorialArrayClassAccess
2010-06-29 01:42:09 +08:00
- \ref TutorialArrayClassCoeffWiseOperations
2010-06-26 08:16:12 +08:00
- \ref TutorialArrayHowToUse
- \ref TutorialArrayClassCoeffWiseOperators
\section TutorialArrayClassWhatIs What is the Array class?
2010-06-29 01:42:09 +08:00
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,
such as adding a constant to every coefficient in the array or multiplying two arrays coefficient-wise.
2010-06-26 08:16:12 +08:00
\subsection TutorialArrayClassTypes Array type and predefined types
2010-06-29 01:42:09 +08:00
The \link ArrayBase Array \endlink class is actually a template that works in a similar way as the \b Matrix one:
2010-06-26 08:16:12 +08:00
\code
//declaring an Array instance
Array<type,numRows,numCols> a;
\endcode
2010-06-29 01:42:09 +08:00
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:
2010-06-26 08:16:12 +08:00
FIXME: explain why these differences-
<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>
2010-06-29 01:42:09 +08:00
\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:
2010-06-26 08:16:12 +08:00
2010-06-29 01:42:09 +08:00
\include Tutorial_ArrayClass_accessing.cpp
2010-06-26 08:16:12 +08:00
2010-06-29 01:42:09 +08:00
Output:
\verbinclude Tutorial_ArrayClass_accessing.out
2010-06-26 08:16:12 +08:00
2010-06-29 01:42:09 +08:00
For more information about the comma initializer, refer to \ref TutorialAdvancedInitialization "this page".
2010-06-26 08:16:12 +08:00
2010-06-29 01:42:09 +08:00
\section TutorialArrayClassCoeffWiseOperations Coefficient-wise operators
\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:
\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:
\include Tutorial_ArrayClass_addition_scalar.cpp
Output:
\verbinclude Tutorial_ArrayClass_addition_scalar.out
\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:
\include Tutorial_ArrayClass_mult.cpp
Output:
\verbinclude Tutorial_ArrayClass_mult.out
2010-06-26 08:16:12 +08:00
\section TutorialArrayHowToUse Using arrays and matrices
2010-06-29 01:42:09 +08:00
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.
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.
<b>IMPORTANT NOTE:</b> 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.
\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:
<table class="tutorial_code"><tr><td>
\include Tutorial_ArrayClass_interop_matrix.cpp
</td>
<td>
Output:
\verbinclude Tutorial_ArrayClass_interop_matrix.out
</td></tr></table>
2010-06-26 08:16:12 +08:00
2010-06-29 01:42:09 +08:00
\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:
2010-06-26 08:16:12 +08:00
2010-06-29 01:42:09 +08:00
<table class="tutorial_code"><tr><td>
\include Tutorial_ArrayClass_interop_array.cpp
</td>
<td>
Output:
\verbinclude Tutorial_ArrayClass_interop_array.out
</td></tr></table>
2010-06-26 08:16:12 +08:00
2010-06-29 01:42:09 +08:00
\subsection TutorialArrayInteropCombination Example with combinations of .array() and .matrix()
Here there is a more advanced example:
<table class="tutorial_code"><tr><td>
\include Tutorial_ArrayClass_interop.cpp
</td>
<td>
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.
2010-06-26 08:16:12 +08:00
\section TutorialArrayClassCoeffWiseOperators Array coefficient-wise operators
2010-06-29 01:42:09 +08:00
FIXME: move to reference table? (I think it is already there)
2010-06-26 08:16:12 +08:00
<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>
**/
}