blob: b8cdf435142ba4e7d35b29d162b3f255a6cadd4e [file] [log] [blame]
Carlos Becker9d440052010-06-25 20:16:12 -04001namespace Eigen {
2
Benoit Jacobe078bb22010-06-26 14:00:00 -04003/** \page TutorialMatrixArithmetic Tutorial page 2 - %Matrix and vector arithmetic
Carlos Becker9d440052010-06-25 20:16:12 -04004 \ingroup Tutorial
5
Benoit Jacobe078bb22010-06-26 14:00:00 -04006\li \b Previous: \ref TutorialMatrixClass
7\li \b Next: \ref TutorialArrayClass
8
9This tutorial aims to provide an overview and some details on how to perform arithmetic
10between matrices, vectors and scalars with Eigen.
Carlos Becker9d440052010-06-25 20:16:12 -040011
Gael Guennebaud2ea1e492012-12-28 18:58:07 +010012\tableofcontents
Carlos Becker9d440052010-06-25 20:16:12 -040013
Benoit Jacobe078bb22010-06-26 14:00:00 -040014\section TutorialArithmeticIntroduction Introduction
Carlos Becker9d440052010-06-25 20:16:12 -040015
Benoit Jacobe078bb22010-06-26 14:00:00 -040016Eigen offers matrix/vector arithmetic operations either through overloads of common C++ arithmetic operators such as +, -, *,
17or through special methods such as dot(), cross(), etc.
18For the Matrix class (matrices and vectors), operators are only overloaded to support
19linear-algebraic operations. For example, \c matrix1 \c * \c matrix2 means matrix-matrix product,
20and \c vector \c + \c scalar is just not allowed. If you want to perform all kinds of array operations,
Jitse Niesen2c03ca32010-07-09 11:46:07 +010021not linear algebra, see the \ref TutorialArrayClass "next page".
Benoit Jacobe078bb22010-06-26 14:00:00 -040022
Jitse Niesen30701642010-06-29 11:42:51 +010023\section TutorialArithmeticAddSub Addition and subtraction
Benoit Jacobe078bb22010-06-26 14:00:00 -040024
25The left hand side and right hand side must, of course, have the same numbers of rows and of columns. They must
26also have the same \c Scalar type, as Eigen doesn't do automatic type promotion. The operators at hand here are:
27\li binary operator + as in \c a+b
28\li binary operator - as in \c a-b
29\li unary operator - as in \c -a
30\li compound operator += as in \c a+=b
31\li compound operator -= as in \c a-=b
32
Gael Guennebaudf66fe262010-10-19 11:40:49 +020033<table class="example">
34<tr><th>Example:</th><th>Output:</th></tr>
35<tr><td>
36\include tut_arithmetic_add_sub.cpp
Jitse Niesen2c03ca32010-07-09 11:46:07 +010037</td>
38<td>
Gael Guennebaudf66fe262010-10-19 11:40:49 +020039\verbinclude tut_arithmetic_add_sub.out
Jitse Niesen2c03ca32010-07-09 11:46:07 +010040</td></tr></table>
Benoit Jacobe078bb22010-06-26 14:00:00 -040041
42\section TutorialArithmeticScalarMulDiv Scalar multiplication and division
43
44Multiplication and division by a scalar is very simple too. The operators at hand here are:
45\li binary operator * as in \c matrix*scalar
46\li binary operator * as in \c scalar*matrix
47\li binary operator / as in \c matrix/scalar
48\li compound operator *= as in \c matrix*=scalar
49\li compound operator /= as in \c matrix/=scalar
50
Gael Guennebaudf66fe262010-10-19 11:40:49 +020051<table class="example">
52<tr><th>Example:</th><th>Output:</th></tr>
53<tr><td>
54\include tut_arithmetic_scalar_mul_div.cpp
Jitse Niesen2c03ca32010-07-09 11:46:07 +010055</td>
56<td>
Gael Guennebaudf66fe262010-10-19 11:40:49 +020057\verbinclude tut_arithmetic_scalar_mul_div.out
Jitse Niesen2c03ca32010-07-09 11:46:07 +010058</td></tr></table>
59
Benoit Jacobe078bb22010-06-26 14:00:00 -040060
61\section TutorialArithmeticMentionXprTemplates A note about expression templates
62
Jitse Niesen2c03ca32010-07-09 11:46:07 +010063This is an advanced topic that we explain on \ref TopicEigenExpressionTemplates "this page",
Benoit Jacobe078bb22010-06-26 14:00:00 -040064but it is useful to just mention it now. In Eigen, arithmetic operators such as \c operator+ don't
65perform any computation by themselves, they just return an "expression object" describing the computation to be
66performed. The actual computation happens later, when the whole expression is evaluated, typically in \c operator=.
67While this might sound heavy, any modern optimizing compiler is able to optimize away that abstraction and
68the result is perfectly optimized code. For example, when you do:
Carlos Becker9d440052010-06-25 20:16:12 -040069\code
Benoit Jacobe078bb22010-06-26 14:00:00 -040070VectorXf a(50), b(50), c(50), d(50);
71...
72a = 3*b + 4*c + 5*d;
Carlos Becker9d440052010-06-25 20:16:12 -040073\endcode
Jitse Niesen30701642010-06-29 11:42:51 +010074Eigen compiles it to just one for loop, so that the arrays are traversed only once. Simplifying (e.g. ignoring
Benoit Jacobe078bb22010-06-26 14:00:00 -040075SIMD optimizations), this loop looks like this:
Carlos Becker9d440052010-06-25 20:16:12 -040076\code
Benoit Jacobe078bb22010-06-26 14:00:00 -040077for(int i = 0; i < 50; ++i)
78 a[i] = 3*b[i] + 4*c[i] + 5*d[i];
Carlos Becker9d440052010-06-25 20:16:12 -040079\endcode
Benoit Jacobe078bb22010-06-26 14:00:00 -040080Thus, you should not be afraid of using relatively large arithmetic expressions with Eigen: it only gives Eigen
81more opportunities for optimization.
82
Gael Guennebaudde1220a2010-06-28 00:05:11 +020083\section TutorialArithmeticTranspose Transposition and conjugation
84
Jitse Niesen2c03ca32010-07-09 11:46:07 +010085The transpose \f$ a^T \f$, conjugate \f$ \bar{a} \f$, and adjoint (i.e., conjugate transpose) \f$ a^* \f$ of a matrix or vector \f$ a \f$ are obtained by the member functions \link DenseBase::transpose() transpose()\endlink, \link MatrixBase::conjugate() conjugate()\endlink, and \link MatrixBase::adjoint() adjoint()\endlink, respectively.
Gael Guennebaudde1220a2010-06-28 00:05:11 +020086
Gael Guennebaudf66fe262010-10-19 11:40:49 +020087<table class="example">
88<tr><th>Example:</th><th>Output:</th></tr>
89<tr><td>
90\include tut_arithmetic_transpose_conjugate.cpp
Gael Guennebaudde1220a2010-06-28 00:05:11 +020091</td>
92<td>
Gael Guennebaudf66fe262010-10-19 11:40:49 +020093\verbinclude tut_arithmetic_transpose_conjugate.out
Gael Guennebaudde1220a2010-06-28 00:05:11 +020094</td></tr></table>
95
Benoit Jacob07f24062010-11-24 08:23:17 -050096For real matrices, \c conjugate() is a no-operation, and so \c adjoint() is equivalent to \c transpose().
Gael Guennebaudde1220a2010-06-28 00:05:11 +020097
Jitse Niesen2c03ca32010-07-09 11:46:07 +010098As for basic arithmetic operators, \c transpose() and \c adjoint() simply return a proxy object without doing the actual transposition. If you do <tt>b = a.transpose()</tt>, then the transpose is evaluated at the same time as the result is written into \c b. However, there is a complication here. If you do <tt>a = a.transpose()</tt>, then Eigen starts writing the result into \c a before the evaluation of the transpose is finished. Therefore, the instruction <tt>a = a.transpose()</tt> does not replace \c a with its transpose, as one would expect:
Gael Guennebaudf66fe262010-10-19 11:40:49 +020099<table class="example">
100<tr><th>Example:</th><th>Output:</th></tr>
101<tr><td>
102\include tut_arithmetic_transpose_aliasing.cpp
Gael Guennebaudde1220a2010-06-28 00:05:11 +0200103</td>
104<td>
Gael Guennebaudf66fe262010-10-19 11:40:49 +0200105\verbinclude tut_arithmetic_transpose_aliasing.out
Gael Guennebaudde1220a2010-06-28 00:05:11 +0200106</td></tr></table>
Jitse Niesen2c03ca32010-07-09 11:46:07 +0100107This is the so-called \ref TopicAliasing "aliasing issue". In "debug mode", i.e., when \ref TopicAssertions "assertions" have not been disabled, such common pitfalls are automatically detected.
108
109For \em in-place transposition, as for instance in <tt>a = a.transpose()</tt>, simply use the \link DenseBase::transposeInPlace() transposeInPlace()\endlink function:
Gael Guennebaudf66fe262010-10-19 11:40:49 +0200110<table class="example">
111<tr><th>Example:</th><th>Output:</th></tr>
112<tr><td>
113\include tut_arithmetic_transpose_inplace.cpp
Gael Guennebaudde1220a2010-06-28 00:05:11 +0200114</td>
115<td>
Gael Guennebaudf66fe262010-10-19 11:40:49 +0200116\verbinclude tut_arithmetic_transpose_inplace.out
Gael Guennebaudde1220a2010-06-28 00:05:11 +0200117</td></tr></table>
Jitse Niesen2c03ca32010-07-09 11:46:07 +0100118There is also the \link MatrixBase::adjointInPlace() adjointInPlace()\endlink function for complex matrices.
Gael Guennebaudde1220a2010-06-28 00:05:11 +0200119
Benoit Jacobe078bb22010-06-26 14:00:00 -0400120\section TutorialArithmeticMatrixMul Matrix-matrix and matrix-vector multiplication
121
122Matrix-matrix multiplication is again done with \c operator*. Since vectors are a special
123case of matrices, they are implicitly handled there too, so matrix-vector product is really just a special
124case of matrix-matrix product, and so is vector-vector outer product. Thus, all these cases are handled by just
125two operators:
126\li binary operator * as in \c a*b
Jitse Niesen2c03ca32010-07-09 11:46:07 +0100127\li compound operator *= as in \c a*=b (this multiplies on the right: \c a*=b is equivalent to <tt>a = a*b</tt>)
Benoit Jacobe078bb22010-06-26 14:00:00 -0400128
Gael Guennebaudf66fe262010-10-19 11:40:49 +0200129<table class="example">
130<tr><th>Example:</th><th>Output:</th></tr>
131<tr><td>
132\include tut_arithmetic_matrix_mul.cpp
Jitse Niesen2c03ca32010-07-09 11:46:07 +0100133</td>
134<td>
Gael Guennebaudf66fe262010-10-19 11:40:49 +0200135\verbinclude tut_arithmetic_matrix_mul.out
Jitse Niesen2c03ca32010-07-09 11:46:07 +0100136</td></tr></table>
Benoit Jacobe078bb22010-06-26 14:00:00 -0400137
138Note: if you read the above paragraph on expression templates and are worried that doing \c m=m*m might cause
139aliasing issues, be reassured for now: Eigen treats matrix multiplication as a special case and takes care of
140introducing a temporary here, so it will compile \c m=m*m as:
Carlos Becker9d440052010-06-25 20:16:12 -0400141\code
Benoit Jacobe078bb22010-06-26 14:00:00 -0400142tmp = m*m;
143m = tmp;
Carlos Becker9d440052010-06-25 20:16:12 -0400144\endcode
Jitse Niesen2c03ca32010-07-09 11:46:07 +0100145If you know your matrix product can be safely evaluated into the destination matrix without aliasing issue, then you can use the \link MatrixBase::noalias() noalias()\endlink function to avoid the temporary, e.g.:
Gael Guennebaud75da2542010-06-28 00:42:57 +0200146\code
147c.noalias() += a * b;
148\endcode
Benoit Jacob07f24062010-11-24 08:23:17 -0500149For more details on this topic, see the page on \ref TopicAliasing "aliasing".
Carlos Becker9d440052010-06-25 20:16:12 -0400150
Gael Guennebaud75da2542010-06-28 00:42:57 +0200151\b Note: for BLAS users worried about performance, expressions such as <tt>c.noalias() -= 2 * a.adjoint() * b;</tt> are fully optimized and trigger a single gemm-like function call.
152
Benoit Jacobe078bb22010-06-26 14:00:00 -0400153\section TutorialArithmeticDotAndCross Dot product and cross product
Carlos Becker9d440052010-06-25 20:16:12 -0400154
Benoit Jacob07f24062010-11-24 08:23:17 -0500155For dot product and cross product, you need the \link MatrixBase::dot() dot()\endlink and \link MatrixBase::cross() cross()\endlink methods. Of course, the dot product can also be obtained as a 1x1 matrix as u.adjoint()*v.
Gael Guennebaudf66fe262010-10-19 11:40:49 +0200156<table class="example">
157<tr><th>Example:</th><th>Output:</th></tr>
158<tr><td>
159\include tut_arithmetic_dot_cross.cpp
Jitse Niesen2c03ca32010-07-09 11:46:07 +0100160</td>
161<td>
Gael Guennebaudf66fe262010-10-19 11:40:49 +0200162\verbinclude tut_arithmetic_dot_cross.out
Jitse Niesen2c03ca32010-07-09 11:46:07 +0100163</td></tr></table>
Carlos Becker9d440052010-06-25 20:16:12 -0400164
Benoit Jacobe078bb22010-06-26 14:00:00 -0400165Remember that cross product is only for vectors of size 3. Dot product is for vectors of any sizes.
166When using complex numbers, Eigen's dot product is conjugate-linear in the first variable and linear in the
167second variable.
Carlos Becker9d440052010-06-25 20:16:12 -0400168
Benoit Jacobe078bb22010-06-26 14:00:00 -0400169\section TutorialArithmeticRedux Basic arithmetic reduction operations
Jitse Niesen2c03ca32010-07-09 11:46:07 +0100170Eigen also provides some reduction operations to reduce a given matrix or vector to a single value such as the sum (computed by \link DenseBase::sum() sum()\endlink), product (\link DenseBase::prod() prod()\endlink), or the maximum (\link DenseBase::maxCoeff() maxCoeff()\endlink) and minimum (\link DenseBase::minCoeff() minCoeff()\endlink) of all its coefficients.
Carlos Becker9d440052010-06-25 20:16:12 -0400171
Gael Guennebaudf66fe262010-10-19 11:40:49 +0200172<table class="example">
173<tr><th>Example:</th><th>Output:</th></tr>
174<tr><td>
175\include tut_arithmetic_redux_basic.cpp
Gael Guennebauddbefd7a2010-06-28 13:30:10 +0200176</td>
177<td>
Gael Guennebaudf66fe262010-10-19 11:40:49 +0200178\verbinclude tut_arithmetic_redux_basic.out
Gael Guennebauddbefd7a2010-06-28 13:30:10 +0200179</td></tr></table>
Carlos Becker9d440052010-06-25 20:16:12 -0400180
Jitse Niesen2c03ca32010-07-09 11:46:07 +0100181The \em trace of a matrix, as returned by the function \link MatrixBase::trace() trace()\endlink, is the sum of the diagonal coefficients and can also be computed as efficiently using <tt>a.diagonal().sum()</tt>, as we will see later on.
Carlos Becker9d440052010-06-25 20:16:12 -0400182
Gael Guennebauddbefd7a2010-06-28 13:30:10 +0200183There also exist variants of the \c minCoeff and \c maxCoeff functions returning the coordinates of the respective coefficient via the arguments:
Carlos Becker9d440052010-06-25 20:16:12 -0400184
Gael Guennebaudf66fe262010-10-19 11:40:49 +0200185<table class="example">
186<tr><th>Example:</th><th>Output:</th></tr>
187<tr><td>
188\include tut_arithmetic_redux_minmax.cpp
Gael Guennebauddbefd7a2010-06-28 13:30:10 +0200189</td>
190<td>
Gael Guennebaudf66fe262010-10-19 11:40:49 +0200191\verbinclude tut_arithmetic_redux_minmax.out
Gael Guennebauddbefd7a2010-06-28 13:30:10 +0200192</td></tr></table>
Carlos Becker9d440052010-06-25 20:16:12 -0400193
Carlos Becker9d440052010-06-25 20:16:12 -0400194
Gael Guennebauddbefd7a2010-06-28 13:30:10 +0200195\section TutorialArithmeticValidity Validity of operations
Benoit Jacobe078bb22010-06-26 14:00:00 -0400196Eigen checks the validity of the operations that you perform. When possible,
Jitse Niesen2c03ca32010-07-09 11:46:07 +0100197it checks them at compile time, producing compilation errors. These error messages can be long and ugly,
Benoit Jacobe078bb22010-06-26 14:00:00 -0400198but Eigen writes the important message in UPPERCASE_LETTERS_SO_IT_STANDS_OUT. For example:
199\code
200 Matrix3f m;
201 Vector4f v;
202 v = m*v; // Compile-time error: YOU_MIXED_MATRICES_OF_DIFFERENT_SIZES
203\endcode
Carlos Becker9d440052010-06-25 20:16:12 -0400204
Benoit Jacobe078bb22010-06-26 14:00:00 -0400205Of course, in many cases, for example when checking dynamic sizes, the check cannot be performed at compile time.
Jitse Niesen2c03ca32010-07-09 11:46:07 +0100206Eigen then uses runtime assertions. This means that the program will abort with an error message when executing an illegal operation if it is run in "debug mode", and it will probably crash if assertions are turned off.
Carlos Becker9d440052010-06-25 20:16:12 -0400207
Benoit Jacobe078bb22010-06-26 14:00:00 -0400208\code
209 MatrixXf m(3,3);
210 VectorXf v(4);
211 v = m * v; // Run-time assertion failure here: "invalid matrix product"
212\endcode
213
214For more details on this topic, see \ref TopicAssertions "this page".
215
216\li \b Next: \ref TutorialArrayClass
Carlos Becker9d440052010-06-25 20:16:12 -0400217
218*/
219
220}