<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> <meta name="generator" content="Doxygen 1.8.5"/> <title>Eigen: Quick reference guide</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> <script type="text/javascript" src="jquery.js"></script> <script type="text/javascript" src="dynsections.js"></script> <link href="navtree.css" rel="stylesheet" type="text/css"/> <script type="text/javascript" src="resize.js"></script> <script type="text/javascript" src="navtree.js"></script> <script type="text/javascript"> $(document).ready(initResizable); $(window).load(resizeHeight); </script> <link href="search/search.css" rel="stylesheet" type="text/css"/> <script type="text/javascript" src="search/search.js"></script> <script type="text/javascript"> $(document).ready(function() { searchBox.OnSelectItem(0); }); </script> <link href="doxygen.css" rel="stylesheet" type="text/css" /> <link href="eigendoxy.css" rel="stylesheet" type="text/css"> <!-- --> <script type="text/javascript" src="eigen_navtree_hacks.js"></script> <!-- <script type="text/javascript"> --> <!-- </script> --> </head> <body> <div id="top"><!-- do not remove this div, it is closed by doxygen! --> <!-- <a name="top"></a> --> <div id="titlearea"> <table cellspacing="0" cellpadding="0"> <tbody> <tr style="height: 56px;"> <td id="projectlogo"><img alt="Logo" src="Eigen_Silly_Professor_64x64.png"/></td> <td style="padding-left: 0.5em;"> <div id="projectname"><a href="http://eigen.tuxfamily.org">Eigen</a>  <span id="projectnumber">3.2.0</span> </div> </td> <td> <div id="MSearchBox" class="MSearchBoxInactive"> <span class="left"> <img id="MSearchSelect" src="search/mag_sel.png" onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" alt=""/> <input type="text" id="MSearchField" value="Search" accesskey="S" onfocus="searchBox.OnSearchFieldFocus(true)" onblur="searchBox.OnSearchFieldFocus(false)" onkeyup="searchBox.OnSearchFieldChange(event)"/> </span><span class="right"> <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a> </span> </div> </td> </tr> </tbody> </table> </div> <!-- end header part --> <!-- Generated by Doxygen 1.8.5 --> <script type="text/javascript"> var searchBox = new SearchBox("searchBox", "search",false,'Search'); </script> </div><!-- top --> <div id="side-nav" class="ui-resizable side-nav-resizable"> <div id="nav-tree"> <div id="nav-tree-contents"> <div id="nav-sync" class="sync"></div> </div> </div> <div id="splitbar" style="-moz-user-select:none;" class="ui-resizable-handle"> </div> </div> <script type="text/javascript"> $(document).ready(function(){initNavTree('group__QuickRefPage.html','');}); </script> <div id="doc-content"> <!-- window showing the filter options --> <div id="MSearchSelectWindow" onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)"> <a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark"> </span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark"> </span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark"> </span>Typedefs</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark"> </span>Enumerations</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(7)"><span class="SelectionMark"> </span>Enumerator</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(8)"><span class="SelectionMark"> </span>Friends</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(9)"><span class="SelectionMark"> </span>Groups</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(10)"><span class="SelectionMark"> </span>Pages</a></div> <!-- iframe showing the search results (closed by default) --> <div id="MSearchResultsWindow"> <iframe src="javascript:void(0)" frameborder="0" name="MSearchResults" id="MSearchResults"> </iframe> </div> <div class="header"> <div class="headertitle"> <div class="title">Quick reference guide<div class="ingroups"><a class="el" href="group__DenseMatrixManipulation__chapter.html">Dense matrix and array manipulation</a></div></div> </div> </div><!--header--> <div class="contents"> <hr/> <p><a href="#" class="top">top</a> </p> <h1><a class="anchor" id="QuickRef_Headers"></a> Modules and Header files</h1> <p>The <a class="el" href="namespaceEigen.html" title="Namespace containing all symbols from the Eigen library. ">Eigen</a> library is divided in a Core module and several additional modules. Each module has a corresponding header file which has to be included in order to use the module. The <code>Dense</code> and <code><a class="el" href="namespaceEigen.html" title="Namespace containing all symbols from the Eigen library. ">Eigen</a></code> header files are provided to conveniently gain access to several modules at once.</p> <table class="manual"> <tr> <th>Module</th><th>Header file</th><th>Contents </th></tr> <tr> <td><a class="el" href="group__Core__Module.html">Core </a></td><td><div class="fragment"><div class="line"><span class="preprocessor">#include <Eigen/Core></span></div> </div><!-- fragment --></td><td><a class="el" href="classEigen_1_1Matrix.html" title="The matrix class, also used for vectors and row-vectors. ">Matrix</a> and <a class="el" href="classEigen_1_1Array.html" title="General-purpose arrays with easy API for coefficient-wise operations. ">Array</a> classes, basic linear algebra (including triangular and selfadjoint products), array manipulation </td></tr> <tr class="alt"> <td><a class="el" href="group__Geometry__Module.html">Geometry </a></td><td><div class="fragment"><div class="line"><span class="preprocessor">#include <Eigen/Geometry></span></div> </div><!-- fragment --></td><td><a class="el" href="classEigen_1_1Transform.html" title="Represents an homogeneous transformation in a N dimensional space. ">Transform</a>, <a class="el" href="classEigen_1_1Translation.html" title="Represents a translation transformation. ">Translation</a>, <a class="el" href="classScaling.html" title="Represents a generic uniform scaling transformation. ">Scaling</a>, <a class="el" href="classEigen_1_1Rotation2D.html" title="Represents a rotation/orientation in a 2 dimensional space. ">Rotation2D</a> and 3D rotations (<a class="el" href="classEigen_1_1Quaternion.html" title="The quaternion class used to represent 3D orientations and rotations. ">Quaternion</a>, <a class="el" href="classEigen_1_1AngleAxis.html" title="Represents a 3D rotation as a rotation angle around an arbitrary 3D axis. ">AngleAxis</a>) </td></tr> <tr> <td><a class="el" href="group__LU__Module.html">LU </a></td><td><div class="fragment"><div class="line"><span class="preprocessor">#include <Eigen/LU></span></div> </div><!-- fragment --></td><td>Inverse, determinant, LU decompositions with solver (<a class="el" href="classEigen_1_1FullPivLU.html" title="LU decomposition of a matrix with complete pivoting, and related features. ">FullPivLU</a>, <a class="el" href="classEigen_1_1PartialPivLU.html" title="LU decomposition of a matrix with partial pivoting, and related features. ">PartialPivLU</a>) </td></tr> <tr> <td><a class="el" href="group__Cholesky__Module.html">Cholesky </a></td><td><div class="fragment"><div class="line"><span class="preprocessor">#include <Eigen/Cholesky></span></div> </div><!-- fragment --></td><td><a class="el" href="classEigen_1_1LLT.html" title="Standard Cholesky decomposition (LL^T) of a matrix and associated features. ">LLT</a> and <a class="el" href="classEigen_1_1LDLT.html" title="Robust Cholesky decomposition of a matrix with pivoting. ">LDLT</a> Cholesky factorization with solver </td></tr> <tr class="alt"> <td><a class="el" href="group__Householder__Module.html">Householder </a></td><td><div class="fragment"><div class="line"><span class="preprocessor">#include <Eigen/Householder></span></div> </div><!-- fragment --></td><td>Householder transformations; this module is used by several linear algebra modules </td></tr> <tr> <td><a class="el" href="group__SVD__Module.html">SVD </a></td><td><div class="fragment"><div class="line"><span class="preprocessor">#include <Eigen/SVD></span></div> </div><!-- fragment --></td><td>SVD decomposition with least-squares solver (<a class="el" href="classEigen_1_1JacobiSVD.html" title="Two-sided Jacobi SVD decomposition of a rectangular matrix. ">JacobiSVD</a>) </td></tr> <tr class="alt"> <td><a class="el" href="group__QR__Module.html">QR </a></td><td><div class="fragment"><div class="line"><span class="preprocessor">#include <Eigen/QR></span></div> </div><!-- fragment --></td><td>QR decomposition with solver (<a class="el" href="classEigen_1_1HouseholderQR.html" title="Householder QR decomposition of a matrix. ">HouseholderQR</a>, <a class="el" href="classEigen_1_1ColPivHouseholderQR.html" title="Householder rank-revealing QR decomposition of a matrix with column-pivoting. ">ColPivHouseholderQR</a>, <a class="el" href="classEigen_1_1FullPivHouseholderQR.html" title="Householder rank-revealing QR decomposition of a matrix with full pivoting. ">FullPivHouseholderQR</a>) </td></tr> <tr> <td><a class="el" href="group__Eigenvalues__Module.html">Eigenvalues </a></td><td><div class="fragment"><div class="line"><span class="preprocessor">#include <Eigen/Eigenvalues></span></div> </div><!-- fragment --></td><td>Eigenvalue, eigenvector decompositions (<a class="el" href="classEigen_1_1EigenSolver.html" title="Computes eigenvalues and eigenvectors of general matrices. ">EigenSolver</a>, <a class="el" href="classEigen_1_1SelfAdjointEigenSolver.html" title="Computes eigenvalues and eigenvectors of selfadjoint matrices. ">SelfAdjointEigenSolver</a>, <a class="el" href="classEigen_1_1ComplexEigenSolver.html" title="Computes eigenvalues and eigenvectors of general complex matrices. ">ComplexEigenSolver</a>) </td></tr> <tr class="alt"> <td><a class="el" href="">Sparse </a></td><td><div class="fragment"><div class="line"><span class="preprocessor">#include <Eigen/Sparse></span></div> </div><!-- fragment --></td><td>Sparse matrix storage and related basic linear algebra (<a class="el" href="classEigen_1_1SparseMatrix.html" title="A versatible sparse matrix representation. ">SparseMatrix</a>, DynamicSparseMatrix, <a class="el" href="classEigen_1_1SparseVector.html" title="a sparse vector class ">SparseVector</a>) </td></tr> <tr> <td></td><td><div class="fragment"><div class="line"><span class="preprocessor">#include <Eigen/Dense></span></div> </div><!-- fragment --></td><td>Includes Core, Geometry, LU, Cholesky, SVD, QR, and Eigenvalues header files </td></tr> <tr class="alt"> <td></td><td><div class="fragment"><div class="line"><span class="preprocessor">#include <Eigen/Eigen></span></div> </div><!-- fragment --></td><td>Includes Dense and Sparse header files (the whole <a class="el" href="namespaceEigen.html" title="Namespace containing all symbols from the Eigen library. ">Eigen</a> library) </td></tr> </table> <p><a href="#" class="top">top</a> </p> <h1><a class="anchor" id="QuickRef_Types"></a> Array, matrix and vector types</h1> <p><b>Recall:</b> <a class="el" href="namespaceEigen.html" title="Namespace containing all symbols from the Eigen library. ">Eigen</a> provides two kinds of dense objects: mathematical matrices and vectors which are both represented by the template class <a class="el" href="classEigen_1_1Matrix.html" title="The matrix class, also used for vectors and row-vectors. ">Matrix</a>, and general 1D and 2D arrays represented by the template class <a class="el" href="classEigen_1_1Array.html" title="General-purpose arrays with easy API for coefficient-wise operations. ">Array</a>: </p> <div class="fragment"><div class="line"><span class="keyword">typedef</span> Matrix<Scalar, RowsAtCompileTime, ColsAtCompileTime, Options> MyMatrixType;</div> <div class="line"><span class="keyword">typedef</span> Array<Scalar, RowsAtCompileTime, ColsAtCompileTime, Options> MyArrayType;</div> </div><!-- fragment --><ul> <li><code>Scalar</code> is the scalar type of the coefficients (e.g., <code>float</code>, <code>double</code>, <code>bool</code>, <code>int</code>, etc.). </li> <li><code>RowsAtCompileTime</code> and <code>ColsAtCompileTime</code> are the number of rows and columns of the matrix as known at compile-time or <code>Dynamic</code>. </li> <li><code>Options</code> can be <code>ColMajor</code> or <code>RowMajor</code>, default is <code>ColMajor</code>. (see class <a class="el" href="classEigen_1_1Matrix.html" title="The matrix class, also used for vectors and row-vectors. ">Matrix</a> for more options)</li> </ul> <p>All combinations are allowed: you can have a matrix with a fixed number of rows and a dynamic number of columns, etc. The following are all valid: </p> <div class="fragment"><div class="line">Matrix<double, 6, Dynamic> <span class="comment">// Dynamic number of columns (heap allocation)</span></div> <div class="line">Matrix<double, Dynamic, 2> <span class="comment">// Dynamic number of rows (heap allocation)</span></div> <div class="line">Matrix<double, Dynamic, Dynamic, RowMajor> <span class="comment">// Fully dynamic, row major (heap allocation)</span></div> <div class="line">Matrix<double, 13, 3> <span class="comment">// Fully fixed (usually allocated on stack)</span></div> </div><!-- fragment --><p>In most cases, you can simply use one of the convenience typedefs for <a class="el" href="group__matrixtypedefs.html">matrices</a> and <a class="el" href="group__arraytypedefs.html">arrays</a>. Some examples: </p> <table class="example"> <tr> <th>Matrices</th><th>Arrays </th></tr> <tr> <td><div class="fragment"><div class="line">Matrix<float,Dynamic,Dynamic> <=> <a class="code" href="group__matrixtypedefs.html#gabab09c32e96cfa9829a88400627af162">MatrixXf</a></div> <div class="line">Matrix<double,Dynamic,1> <=> <a class="code" href="group__matrixtypedefs.html#ga3da45e59796fbacf67fa568297927bd1">VectorXd</a></div> <div class="line">Matrix<int,1,Dynamic> <=> <a class="code" href="group__matrixtypedefs.html#ga2a50ca3334794218c2b5096fa25ca229">RowVectorXi</a></div> <div class="line">Matrix<float,3,3> <=> <a class="code" href="group__matrixtypedefs.html#ga2b787393a7fc870d99aa634f60b2510c">Matrix3f</a></div> <div class="line">Matrix<float,4,1> <=> <a class="code" href="group__matrixtypedefs.html#ga96452a1b0400ea4ef7935e06914a56b1">Vector4f</a></div> </div><!-- fragment --></td><td><div class="fragment"><div class="line">Array<float,Dynamic,Dynamic> <=> ArrayXXf</div> <div class="line">Array<double,Dynamic,1> <=> ArrayXd</div> <div class="line">Array<int,1,Dynamic> <=> RowArrayXi</div> <div class="line">Array<float,3,3> <=> Array33f</div> <div class="line">Array<float,4,1> <=> Array4f</div> </div><!-- fragment --> </td></tr> </table> <p>Conversion between the matrix and array worlds: </p> <div class="fragment"><div class="line">Array44f a1, a1;</div> <div class="line"><a class="code" href="group__matrixtypedefs.html#ga548963d9c2934037af5f8e5b3df87e45">Matrix4f</a> m1, m2;</div> <div class="line">m1 = a1 * a2; <span class="comment">// coeffwise product, implicit conversion from array to matrix.</span></div> <div class="line">a1 = m1 * m2; <span class="comment">// matrix product, implicit conversion from matrix to array.</span></div> <div class="line">a2 = a1 + m1.<a class="code" href="classEigen_1_1MatrixBase.html#a4545be7a9af33ba337a4ebb0101395fd">array</a>(); <span class="comment">// mixing array and matrix is forbidden</span></div> <div class="line">m2 = a1.matrix() + m1; <span class="comment">// and explicit conversion is required.</span></div> <div class="line">ArrayWrapper<Matrix4f> m1a(m1); <span class="comment">// m1a is an alias for m1.array(), they share the same coefficients</span></div> <div class="line">MatrixWrapper<Array44f> a1m(a1);</div> </div><!-- fragment --><p>In the rest of this document we will use the following symbols to emphasize the features which are specifics to a given kind of object: </p> <ul> <li><a class="anchor" id="matrixonly"></a><a href="#matrixonly" style="color:green;text-decoration: none;">*</a> linear algebra matrix and vector only </li> <li><a class="anchor" id="arrayonly"></a><a href="#arrayonly" style="color:blue;text-decoration: none;">*</a> array objects only</li> </ul> <h2><a class="anchor" id="QuickRef_Basics"></a> Basic matrix manipulation</h2> <table class="manual"> <tr> <th></th><th>1D objects</th><th>2D objects</th><th>Notes </th></tr> <tr> <td>Constructors </td><td><div class="fragment"><div class="line"><a class="code" href="group__matrixtypedefs.html#ga9bdb6b1010218b700f4bc0d23c7d2ee8">Vector4d</a> v4;</div> <div class="line"><a class="code" href="group__matrixtypedefs.html#ga7f1b1fd6061c265796ef9f5742854bee">Vector2f</a> v1(x, y);</div> <div class="line">Array3i v2(x, y, z);</div> <div class="line"><a class="code" href="group__matrixtypedefs.html#ga9bdb6b1010218b700f4bc0d23c7d2ee8">Vector4d</a> v3(x, y, z, w);</div> <div class="line"></div> <div class="line">VectorXf v5; <span class="comment">// empty object</span></div> <div class="line">ArrayXf v6(size);</div> </div><!-- fragment --></td><td><div class="fragment"><div class="line"><a class="code" href="group__matrixtypedefs.html#ga548963d9c2934037af5f8e5b3df87e45">Matrix4f</a> m1;</div> <div class="line"></div> <div class="line"></div> <div class="line"></div> <div class="line"></div> <div class="line"><a class="code" href="group__matrixtypedefs.html#gabab09c32e96cfa9829a88400627af162">MatrixXf</a> m5; <span class="comment">// empty object</span></div> <div class="line"><a class="code" href="group__matrixtypedefs.html#gabab09c32e96cfa9829a88400627af162">MatrixXf</a> m6(nb_rows, nb_columns);</div> </div><!-- fragment --></td><td class="note">By default, the coefficients <br/> are left uninitialized </td></tr> <tr class="alt"> <td>Comma initializer </td><td><div class="fragment"><div class="line"><a class="code" href="group__matrixtypedefs.html#ga5ac9fb0df0c4858477890cce1f998096">Vector3f</a> v1; v1 << x, y, z;</div> <div class="line">ArrayXf v2(4); v2 << 1, 2, 3, 4;</div> </div><!-- fragment --></td><td><div class="fragment"><div class="line"><a class="code" href="group__matrixtypedefs.html#ga2b787393a7fc870d99aa634f60b2510c">Matrix3f</a> m1; m1 << 1, 2, 3,</div> <div class="line"> 4, 5, 6,</div> <div class="line"> 7, 8, 9;</div> </div><!-- fragment --></td><td><p class="starttd"></p> <p class="endtd"></p> </td></tr> <tr> <td>Comma initializer (bis) </td><td colspan="2"><div class="fragment"><div class="line"><span class="keywordtype">int</span> rows=5, cols=5;</div> <div class="line"><a class="code" href="group__matrixtypedefs.html#gabab09c32e96cfa9829a88400627af162">MatrixXf</a> m(rows,cols);</div> <div class="line">m << (<a class="code" href="group__matrixtypedefs.html#ga2b787393a7fc870d99aa634f60b2510c">Matrix3f</a>() << 1, 2, 3, 4, 5, 6, 7, 8, 9).finished(),</div> <div class="line"> <a class="code" href="classEigen_1_1DenseBase.html#a2e36721b4833498b713e94a7948c6a29">MatrixXf::Zero</a>(3,cols-3),</div> <div class="line"> <a class="code" href="classEigen_1_1DenseBase.html#a2e36721b4833498b713e94a7948c6a29">MatrixXf::Zero</a>(rows-3,3),</div> <div class="line"> <a class="code" href="classEigen_1_1MatrixBase.html#a0650b65c6ae6c3d19a138b72a6d68568">MatrixXf::Identity</a>(rows-3,cols-3);</div> <div class="line">cout << m;</div> </div><!-- fragment --> </td><td><p class="starttd">output: </p> <pre class="fragment">1 2 3 0 0 4 5 6 0 0 7 8 9 0 0 0 0 0 1 0 0 0 0 0 1</pre> <p class="endtd"></p> </td></tr> <tr class="alt"> <td>Runtime info </td><td><div class="fragment"><div class="line">vector.size();</div> <div class="line"></div> <div class="line">vector.innerStride();</div> <div class="line">vector.data();</div> </div><!-- fragment --></td><td><div class="fragment"><div class="line">matrix.rows(); matrix.cols();</div> <div class="line">matrix.innerSize(); matrix.outerSize();</div> <div class="line">matrix.innerStride(); matrix.outerStride();</div> <div class="line">matrix.data();</div> </div><!-- fragment --></td><td class="note">Inner/Outer* are storage order dependent </td></tr> <tr> <td>Compile-time info </td><td colspan="2"><div class="fragment"><div class="line">ObjectType::Scalar ObjectType::RowsAtCompileTime</div> <div class="line">ObjectType::RealScalar ObjectType::ColsAtCompileTime</div> <div class="line">ObjectType::Index ObjectType::SizeAtCompileTime</div> </div><!-- fragment --></td><td></td></tr> <tr class="alt"> <td>Resizing </td><td><div class="fragment"><div class="line">vector.resize(size);</div> <div class="line"></div> <div class="line"></div> <div class="line">vector.resizeLike(other_vector);</div> <div class="line">vector.conservativeResize(size);</div> </div><!-- fragment --></td><td><div class="fragment"><div class="line">matrix.resize(nb_rows, nb_cols);</div> <div class="line">matrix.resize(Eigen::NoChange, nb_cols);</div> <div class="line">matrix.resize(nb_rows, Eigen::NoChange);</div> <div class="line">matrix.resizeLike(other_matrix);</div> <div class="line">matrix.conservativeResize(nb_rows, nb_cols);</div> </div><!-- fragment --></td><td class="note"><p class="starttd">no-op if the new sizes match,<br/> otherwise data are lost<br/> <br/> resizing with data preservation</p> <p class="endtd"></p> </td></tr> <tr> <td>Coeff access with <br/> range checking </td><td><div class="fragment"><div class="line">vector(i) vector.x()</div> <div class="line">vector[i] vector.y()</div> <div class="line"> vector.z()</div> <div class="line"> vector.w()</div> </div><!-- fragment --></td><td><div class="fragment"><div class="line">matrix(i,j)</div> </div><!-- fragment --></td><td class="note"><p class="starttd">Range checking is disabled if <br/> NDEBUG or EIGEN_NO_DEBUG is defined</p> <p class="endtd"></p> </td></tr> <tr class="alt"> <td>Coeff access without <br/> range checking </td><td><div class="fragment"><div class="line">vector.coeff(i)</div> <div class="line">vector.coeffRef(i)</div> </div><!-- fragment --></td><td><div class="fragment"><div class="line">matrix.coeff(i,j)</div> <div class="line">matrix.coeffRef(i,j)</div> </div><!-- fragment --></td><td><p class="starttd"></p> <p class="endtd"></p> </td></tr> <tr> <td>Assignment/copy </td><td colspan="2"><div class="fragment"><div class="line"><span class="keywordtype">object</span> = expression;</div> <div class="line">object_of_float = expression_of_double.cast<<span class="keywordtype">float</span>>();</div> </div><!-- fragment --></td><td class="note"><p class="starttd">the destination is automatically resized (if possible)</p> <p class="endtd"></p> </td></tr> </table> <h2><a class="anchor" id="QuickRef_PredefMat"></a> Predefined Matrices</h2> <table class="manual"> <tr> <th>Fixed-size matrix or vector </th><th>Dynamic-size matrix </th><th>Dynamic-size vector </th></tr> <tr style="border-bottom-style: none;"> <td><div class="fragment"><div class="line"><span class="keyword">typedef</span> {<a class="code" href="group__matrixtypedefs.html#ga2b787393a7fc870d99aa634f60b2510c">Matrix3f</a>|Array33f} FixedXD;</div> <div class="line">FixedXD x;</div> <div class="line"></div> <div class="line">x = FixedXD::Zero();</div> <div class="line">x = FixedXD::Ones();</div> <div class="line">x = FixedXD::Constant(value);</div> <div class="line">x = FixedXD::Random();</div> <div class="line">x = FixedXD::LinSpaced(size, low, high);</div> <div class="line"></div> <div class="line">x.setZero();</div> <div class="line">x.setOnes();</div> <div class="line">x.setConstant(value);</div> <div class="line">x.setRandom();</div> <div class="line">x.setLinSpaced(size, low, high);</div> </div><!-- fragment --> </td><td><div class="fragment"><div class="line"><span class="keyword">typedef</span> {<a class="code" href="group__matrixtypedefs.html#gabab09c32e96cfa9829a88400627af162">MatrixXf</a>|ArrayXXf} Dynamic2D;</div> <div class="line">Dynamic2D x;</div> <div class="line"></div> <div class="line">x = Dynamic2D::Zero(rows, cols);</div> <div class="line">x = Dynamic2D::Ones(rows, cols);</div> <div class="line">x = Dynamic2D::Constant(rows, cols, value);</div> <div class="line">x = Dynamic2D::Random(rows, cols);</div> <div class="line">N/A</div> <div class="line"></div> <div class="line">x.<a class="code" href="classEigen_1_1PlainObjectBase.html#a04abe84a9a894de335a232681d9a0722">setZero</a>(rows, cols);</div> <div class="line">x.setOnes(rows, cols);</div> <div class="line">x.setConstant(rows, cols, value);</div> <div class="line">x.setRandom(rows, cols);</div> <div class="line">N/A</div> </div><!-- fragment --> </td><td><div class="fragment"><div class="line"><span class="keyword">typedef</span> {VectorXf|ArrayXf} Dynamic1D;</div> <div class="line">Dynamic1D x;</div> <div class="line"></div> <div class="line">x = Dynamic1D::Zero(size);</div> <div class="line">x = Dynamic1D::Ones(size);</div> <div class="line">x = Dynamic1D::Constant(size, value);</div> <div class="line">x = Dynamic1D::Random(size);</div> <div class="line">x = Dynamic1D::LinSpaced(size, low, high);</div> <div class="line"></div> <div class="line">x.setZero(size);</div> <div class="line">x.setOnes(size);</div> <div class="line">x.setConstant(size, value);</div> <div class="line">x.setRandom(size);</div> <div class="line">x.setLinSpaced(size, low, high);</div> </div><!-- fragment --> <p class="endtd"></p> </td></tr> <tr> <td colspan="3">Identity and <a class="el" href="classEigen_1_1MatrixBase.html#ae908d6321d43a20ed57d9f6c1c6acbe9">basis vectors </a> <a href="#matrixonly" style="color:green;text-decoration: none;">*</a> </td></tr> <tr style="border-bottom-style: none;"> <td><div class="fragment"><div class="line">x = FixedXD::Identity();</div> <div class="line">x.setIdentity();</div> <div class="line"></div> <div class="line"><a class="code" href="classEigen_1_1MatrixBase.html#a5e0e42c39330e4274d2d0479048ebc37">Vector3f::UnitX</a>() <span class="comment">// 1 0 0</span></div> <div class="line"><a class="code" href="group__matrixtypedefs.html#ga5ac9fb0df0c4858477890cce1f998096">Vector3f</a>::UnitY() <span class="comment">// 0 1 0</span></div> <div class="line"><a class="code" href="group__matrixtypedefs.html#ga5ac9fb0df0c4858477890cce1f998096">Vector3f</a>::UnitZ() <span class="comment">// 0 0 1</span></div> </div><!-- fragment --> </td><td><div class="fragment"><div class="line">x = Dynamic2D::Identity(rows, cols);</div> <div class="line">x.setIdentity(rows, cols);</div> <div class="line"></div> <div class="line"></div> <div class="line"></div> <div class="line">N/A</div> </div><!-- fragment --> </td><td><div class="fragment"><div class="line">N/A</div> <div class="line"></div> <div class="line"></div> <div class="line"><a class="code" href="classEigen_1_1MatrixBase.html#ae908d6321d43a20ed57d9f6c1c6acbe9">VectorXf::Unit</a>(size,i)</div> <div class="line">VectorXf::Unit(4,1) == <a class="code" href="group__matrixtypedefs.html#ga96452a1b0400ea4ef7935e06914a56b1">Vector4f</a>(0,1,0,0)</div> <div class="line"> == Vector4f::UnitY()</div> </div><!-- fragment --> </td></tr> </table> <h2><a class="anchor" id="QuickRef_Map"></a> Mapping external arrays</h2> <table class="manual"> <tr> <td>Contiguous <br/> memory </td><td><div class="fragment"><div class="line"><span class="keywordtype">float</span> data[] = {1,2,3,4};</div> <div class="line">Map<Vector3f> v1(data); <span class="comment">// uses v1 as a Vector3f object</span></div> <div class="line">Map<ArrayXf> v2(data,3); <span class="comment">// uses v2 as a ArrayXf object</span></div> <div class="line">Map<Array22f> m1(data); <span class="comment">// uses m1 as a Array22f object</span></div> <div class="line">Map<MatrixXf> m2(data,2,2); <span class="comment">// uses m2 as a MatrixXf object</span></div> </div><!-- fragment --> </td></tr> <tr> <td>Typical usage <br/> of strides </td><td><div class="fragment"><div class="line"><span class="keywordtype">float</span> data[] = {1,2,3,4,5,6,7,8,9};</div> <div class="line">Map<VectorXf,0,InnerStride<2> > v1(data,3); <span class="comment">// = [1,3,5]</span></div> <div class="line">Map<VectorXf,0,InnerStride<> > v2(data,3,InnerStride<>(3)); <span class="comment">// = [1,4,7]</span></div> <div class="line">Map<MatrixXf,0,OuterStride<3> > m2(data,2,3); <span class="comment">// both lines |1,4,7|</span></div> <div class="line">Map<MatrixXf,0,OuterStride<> > m1(data,2,3,OuterStride<>(3)); <span class="comment">// are equal to: |2,5,8|</span></div> </div><!-- fragment --> </td></tr> </table> <p><a href="#" class="top">top</a> </p> <h1><a class="anchor" id="QuickRef_ArithmeticOperators"></a> Arithmetic Operators</h1> <table class="manual"> <tr> <td>add <br/> subtract</td><td><div class="fragment"><div class="line">mat3 = mat1 + mat2; mat3 += mat1;</div> <div class="line">mat3 = mat1 - mat2; mat3 -= mat1;</div> </div><!-- fragment --> </td></tr> <tr class="alt"> <td>scalar product</td><td><div class="fragment"><div class="line">mat3 = mat1 * s1; mat3 *= s1; mat3 = s1 * mat1;</div> <div class="line">mat3 = mat1 / s1; mat3 /= s1;</div> </div><!-- fragment --> </td></tr> <tr> <td>matrix/vector <br/> products <a href="#matrixonly" style="color:green;text-decoration: none;">*</a></td><td><div class="fragment"><div class="line">col2 = mat1 * col1;</div> <div class="line">row2 = row1 * mat1; row1 *= mat1;</div> <div class="line">mat3 = mat1 * mat2; mat3 *= mat1; </div> </div><!-- fragment --> </td></tr> <tr class="alt"> <td>transposition <br/> adjoint <a href="#matrixonly" style="color:green;text-decoration: none;">*</a></td><td><div class="fragment"><div class="line">mat1 = mat2.transpose(); mat1.transposeInPlace();</div> <div class="line">mat1 = mat2.adjoint(); mat1.adjointInPlace();</div> </div><!-- fragment --> </td></tr> <tr> <td><a class="el" href="classEigen_1_1MatrixBase.html#adb71ddef4955ae7d353df12d05665191">dot </a> product <br/> inner product <a href="#matrixonly" style="color:green;text-decoration: none;">*</a></td><td><div class="fragment"><div class="line">scalar = vec1.dot(vec2);</div> <div class="line">scalar = col1.adjoint() * col2;</div> <div class="line">scalar = (col1.adjoint() * col2).value();</div> </div><!-- fragment --> </td></tr> <tr class="alt"> <td>outer product <a href="#matrixonly" style="color:green;text-decoration: none;">*</a></td><td><div class="fragment"><div class="line">mat = col1 * col2.transpose();</div> </div><!-- fragment --> <p class="endtd"></p> </td></tr> <tr> <td><a class="el" href="classEigen_1_1MatrixBase.html#a0be1b433c65ce9d92c81a4718daf54e5">norm </a> <br/> <a class="el" href="classEigen_1_1MatrixBase.html#a8ed1fb2e792b1079639a74e3581fbc74">normalization </a> <a href="#matrixonly" style="color:green;text-decoration: none;">*</a></td><td><div class="fragment"><div class="line">scalar = vec1.norm(); scalar = vec1.squaredNorm()</div> <div class="line">vec2 = vec1.normalized(); vec1.normalize(); <span class="comment">// inplace </span></div> </div><!-- fragment --> <p class="endtd"></p> </td></tr> <tr class="alt"> <td><a class="el" href="">cross product </a> <a href="#matrixonly" style="color:green;text-decoration: none;">*</a></td><td><div class="fragment"><div class="line"><span class="preprocessor">#include <Eigen/Geometry></span></div> <div class="line">vec3 = vec1.cross(vec2);</div> </div><!-- fragment --> </td></tr> </table> <p><a href="#" class="top">top</a> </p> <h1><a class="anchor" id="QuickRef_Coeffwise"></a> Coefficient-wise & Array operators</h1> <p>Coefficient-wise operators for matrices and vectors: </p> <table class="manual"> <tr> <th><a class="el" href="classEigen_1_1Matrix.html" title="The matrix class, also used for vectors and row-vectors. ">Matrix</a> API <a href="#matrixonly" style="color:green;text-decoration: none;">*</a></th><th>Via <a class="el" href="classEigen_1_1Array.html" title="General-purpose arrays with easy API for coefficient-wise operations. ">Array</a> conversions </th></tr> <tr> <td><div class="fragment"><div class="line">mat1.cwiseMin(mat2)</div> <div class="line">mat1.cwiseMax(mat2)</div> <div class="line">mat1.cwiseAbs2()</div> <div class="line">mat1.cwiseAbs()</div> <div class="line">mat1.cwiseSqrt()</div> <div class="line">mat1.cwiseProduct(mat2)</div> <div class="line">mat1.cwiseQuotient(mat2)</div> </div><!-- fragment --> </td><td><div class="fragment"><div class="line">mat1.array().min(mat2.array())</div> <div class="line">mat1.array().max(mat2.array())</div> <div class="line">mat1.array().abs2()</div> <div class="line">mat1.array().abs()</div> <div class="line">mat1.array().sqrt()</div> <div class="line">mat1.array() * mat2.array()</div> <div class="line">mat1.array() / mat2.array()</div> </div><!-- fragment --> </td></tr> </table> <p>It is also very simple to apply any user defined function <code>foo</code> using DenseBase::unaryExpr together with std::ptr_fun: </p> <div class="fragment"><div class="line">mat1.unaryExpr(std::ptr_fun(foo))</div> </div><!-- fragment --><p><a class="el" href="classEigen_1_1Array.html" title="General-purpose arrays with easy API for coefficient-wise operations. ">Array</a> operators:<a href="#arrayonly" style="color:blue;text-decoration: none;">*</a></p> <table class="manual"> <tr> <td>Arithmetic operators</td><td><div class="fragment"><div class="line">array1 * array2 array1 / array2 array1 *= array2 array1 /= array2</div> <div class="line">array1 + scalar array1 - scalar array1 += scalar array1 -= scalar</div> </div><!-- fragment --> </td></tr> <tr> <td>Comparisons</td><td><div class="fragment"><div class="line">array1 < array2 array1 > array2 array1 < scalar array1 > scalar</div> <div class="line">array1 <= array2 array1 >= array2 array1 <= scalar array1 >= scalar</div> <div class="line">array1 == array2 array1 != array2 array1 == scalar array1 != scalar</div> </div><!-- fragment --> </td></tr> <tr> <td>Trigo, power, and <br/> misc functions <br/> and the STL variants</td><td><div class="fragment"><div class="line">array1.min(array2) </div> <div class="line">array1.max(array2) </div> <div class="line">array1.abs2()</div> <div class="line">array1.abs() std::abs(array1)</div> <div class="line">array1.sqrt() std::sqrt(array1)</div> <div class="line">array1.log() std::log(array1)</div> <div class="line">array1.exp() std::exp(array1)</div> <div class="line">array1.pow(exponent) std::pow(array1,exponent)</div> <div class="line">array1.square()</div> <div class="line">array1.cube()</div> <div class="line">array1.inverse()</div> <div class="line">array1.sin() std::sin(array1)</div> <div class="line">array1.cos() std::cos(array1)</div> <div class="line">array1.tan() std::tan(array1)</div> <div class="line">array1.asin() std::asin(array1)</div> <div class="line">array1.acos() std::acos(array1)</div> </div><!-- fragment --> </td></tr> </table> <p><a href="#" class="top">top</a> </p> <h1><a class="anchor" id="QuickRef_Reductions"></a> Reductions</h1> <p><a class="el" href="namespaceEigen.html" title="Namespace containing all symbols from the Eigen library. ">Eigen</a> provides several reduction methods such as: <a class="el" href="classEigen_1_1DenseBase.html#add6cb2d85282829eb9adc9565ce784d6">minCoeff() </a>, <a class="el" href="classEigen_1_1DenseBase.html#a878f0dae18b28d8158c5f1c232edced2">maxCoeff() </a>, <a class="el" href="classEigen_1_1DenseBase.html#a3a3b3fb530d3364ecef0bf9c9daf0983">sum() </a>, <a class="el" href="classEigen_1_1DenseBase.html#a6bdcbfa7e3b07d3246ad80de7170b0f5">prod() </a>, <a class="el" href="classEigen_1_1MatrixBase.html#a71696dd0adbf4731561fd60e55c3a96e">trace() </a> <a href="#matrixonly" style="color:green;text-decoration: none;">*</a>, <a class="el" href="classEigen_1_1MatrixBase.html#a0be1b433c65ce9d92c81a4718daf54e5">norm() </a> <a href="#matrixonly" style="color:green;text-decoration: none;">*</a>, <a class="el" href="classEigen_1_1MatrixBase.html#a229bd5cc6237359a1d85401743476ede">squaredNorm() </a> <a href="#matrixonly" style="color:green;text-decoration: none;">*</a>, <a class="el" href="classEigen_1_1DenseBase.html#aea914316af61df197f21629e14e7870a">all() </a>, and <a class="el" href="classEigen_1_1DenseBase.html#a42571e028736ca9103bac8b50f269824">any() </a>. All reduction operations can be done matrix-wise, <a class="el" href="classEigen_1_1DenseBase.html#abe7ae69362c464b6721adbb47c655874">column-wise </a> or <a class="el" href="classEigen_1_1DenseBase.html#a8a7fd1e8004d4bd93a7ea36957aa8e99">row-wise </a>. Usage example: </p> <table class="manual"> <tr> <td rowspan="3" style="border-right-style:dashed;vertical-align:middle"><div class="fragment"><div class="line"> 5 3 1</div> <div class="line">mat = 2 7 8</div> <div class="line"> 9 4 6 </div> </div><!-- fragment --> </td><td><div class="fragment"><div class="line">mat.minCoeff(); </div> </div><!-- fragment --></td><td><div class="fragment"><div class="line">1 </div> </div><!-- fragment --> </td></tr> <tr class="alt"> <td><div class="fragment"><div class="line">mat.colwise().minCoeff(); </div> </div><!-- fragment --></td><td><div class="fragment"><div class="line">2 3 1 </div> </div><!-- fragment --> </td></tr> <tr style="vertical-align:middle"> <td><div class="fragment"><div class="line">mat.rowwise().minCoeff(); </div> </div><!-- fragment --></td><td><div class="fragment"><div class="line">1</div> <div class="line">2</div> <div class="line">4</div> </div><!-- fragment --> </td></tr> </table> <p>Special versions of <a class="el" href="classEigen_1_1DenseBase.html#ad927d600371ba16dcb44518530ba906a">minCoeff </a> and <a class="el" href="classEigen_1_1DenseBase.html#aad851ef369d212dcea81d9cded12dbdd">maxCoeff </a>: </p> <div class="fragment"><div class="line"><span class="keywordtype">int</span> i, j;</div> <div class="line">s = vector.minCoeff(&i); <span class="comment">// s == vector[i]</span></div> <div class="line">s = matrix.maxCoeff(&i, &j); <span class="comment">// s == matrix(i,j)</span></div> </div><!-- fragment --><p> Typical use cases of all() and any(): </p> <div class="fragment"><div class="line"><span class="keywordflow">if</span>((array1 > 0).all()) ... <span class="comment">// if all coefficients of array1 are greater than 0 ...</span></div> <div class="line"><span class="keywordflow">if</span>((array1 < array2).any()) ... <span class="comment">// if there exist a pair i,j such that array1(i,j) < array2(i,j) ...</span></div> </div><!-- fragment --><p><a href="#" class="top">top</a></p> <h1><a class="anchor" id="QuickRef_Blocks"></a> Sub-matrices</h1> <p>Read-write access to a <a class="el" href="classEigen_1_1DenseBase.html#a58c77695de3b33405f01f2fdf3dc389d">column </a> or a <a class="el" href="classEigen_1_1DenseBase.html#aa8716d44f51321072ee5c88665c28813">row </a> of a matrix (or array): </p> <div class="fragment"><div class="line">mat1.row(i) = mat2.col(j);</div> <div class="line">mat1.col(j1).swap(mat1.col(j2));</div> </div><!-- fragment --><p>Read-write access to sub-vectors: </p> <table class="manual"> <tr> <th>Default versions </th><th>Optimized versions when the size <br/> is known at compile time </th><th><p class="starttd"></p> <p class="endtd"></p> </th></tr> <tr> <td><div class="fragment"><div class="line">vec1.head(n)</div> </div><!-- fragment --></td><td><div class="fragment"><div class="line">vec1.head<n>()</div> </div><!-- fragment --></td><td>the first <code>n</code> coeffs </td></tr> <tr> <td><div class="fragment"><div class="line">vec1.tail(n)</div> </div><!-- fragment --></td><td><div class="fragment"><div class="line">vec1.tail<n>()</div> </div><!-- fragment --></td><td>the last <code>n</code> coeffs </td></tr> <tr> <td><div class="fragment"><div class="line">vec1.segment(pos,n)</div> </div><!-- fragment --></td><td><div class="fragment"><div class="line">vec1.segment<n>(pos)</div> </div><!-- fragment --> </td><td>the <code>n</code> coeffs in the <br/> range [<code>pos</code> : <code>pos</code> + <code>n</code> - 1] </td></tr> <tr class="alt"> <td colspan="3"><p class="starttd"></p> <p class="endtd">Read-write access to sub-matrices: </p> </td></tr> <tr> <td><div class="fragment"><div class="line">mat1.block(i,j,rows,cols)</div> </div><!-- fragment --> <a class="el" href="classEigen_1_1DenseBase.html#a1dbaa2fc7b809720407130f48dfacf8f">(more) </a> </td><td><div class="fragment"><div class="line">mat1.block<rows,cols>(i,j)</div> </div><!-- fragment --> <a class="el" href="classEigen_1_1DenseBase.html#a3e433315822db2811a65e88c70672743">(more) </a> </td><td>the <code>rows</code> x <code>cols</code> sub-matrix <br/> starting from position (<code>i</code>,<code>j</code>) </td></tr> <tr> <td><div class="fragment"><div class="line">mat1.topLeftCorner(rows,cols)</div> <div class="line">mat1.topRightCorner(rows,cols)</div> <div class="line">mat1.bottomLeftCorner(rows,cols)</div> <div class="line">mat1.bottomRightCorner(rows,cols)</div> </div><!-- fragment --> </td><td><div class="fragment"><div class="line">mat1.topLeftCorner<rows,cols>()</div> <div class="line">mat1.topRightCorner<rows,cols>()</div> <div class="line">mat1.bottomLeftCorner<rows,cols>()</div> <div class="line">mat1.bottomRightCorner<rows,cols>()</div> </div><!-- fragment --> </td><td>the <code>rows</code> x <code>cols</code> sub-matrix <br/> taken in one of the four corners </td></tr> <tr> <td><div class="fragment"><div class="line">mat1.topRows(rows)</div> <div class="line">mat1.bottomRows(rows)</div> <div class="line">mat1.leftCols(cols)</div> <div class="line">mat1.rightCols(cols)</div> </div><!-- fragment --> </td><td><div class="fragment"><div class="line">mat1.topRows<rows>()</div> <div class="line">mat1.bottomRows<rows>()</div> <div class="line">mat1.leftCols<cols>()</div> <div class="line">mat1.rightCols<cols>()</div> </div><!-- fragment --> </td><td>specialized versions of block() <br/> when the block fit two corners </td></tr> </table> <p><a href="#" class="top">top</a></p> <h1><a class="anchor" id="QuickRef_Misc"></a> Miscellaneous operations</h1> <h2><a class="anchor" id="QuickRef_Reverse"></a> Reverse</h2> <p>Vectors, rows, and/or columns of a matrix can be reversed (see <a class="el" href="classEigen_1_1DenseBase.html#a6e354bb81f0c7b6888c6a0ce4b4649e2">DenseBase::reverse()</a>, <a class="el" href="classEigen_1_1DenseBase.html#af148c4e77e657d04573c4fda43740ed5">DenseBase::reverseInPlace()</a>, <a class="el" href="classEigen_1_1VectorwiseOp.html#a04e38b3a68fe5ae6908594f3b1ec618c">VectorwiseOp::reverse()</a>). </p> <div class="fragment"><div class="line">vec.reverse() mat.colwise().reverse() mat.rowwise().reverse()</div> <div class="line">vec.reverseInPlace()</div> </div><!-- fragment --><h2><a class="anchor" id="QuickRef_Replicate"></a> Replicate</h2> <p>Vectors, matrices, rows, and/or columns can be replicated in any direction (see <a class="el" href="classEigen_1_1DenseBase.html#afca0e8ff7921ee0e3ab4422818ecb214">DenseBase::replicate()</a>, <a class="el" href="classEigen_1_1VectorwiseOp.html#a9a078997c488c2d83fbd45108af26e1d">VectorwiseOp::replicate()</a>) </p> <div class="fragment"><div class="line">vec.replicate(times) vec.replicate<Times></div> <div class="line">mat.replicate(vertical_times, horizontal_times) mat.replicate<VerticalTimes, HorizontalTimes>()</div> <div class="line">mat.colwise().replicate(vertical_times, horizontal_times) mat.colwise().replicate<VerticalTimes, HorizontalTimes>()</div> <div class="line">mat.rowwise().replicate(vertical_times, horizontal_times) mat.rowwise().replicate<VerticalTimes, HorizontalTimes>()</div> </div><!-- fragment --><p><a href="#" class="top">top</a></p> <h1><a class="anchor" id="QuickRef_DiagTriSymm"></a> Diagonal, Triangular, and Self-adjoint matrices</h1> <p>(matrix world <a href="#matrixonly" style="color:green;text-decoration: none;">*</a>)</p> <h2><a class="anchor" id="QuickRef_Diagonal"></a> Diagonal matrices</h2> <table class="example"> <tr> <th>Operation</th><th>Code </th></tr> <tr> <td>view a vector <a class="el" href="classEigen_1_1MatrixBase.html#adaf22d3a2069ec2c0df912cb87329e9c">as a diagonal matrix </a> <br/> </td><td><div class="fragment"><div class="line">mat1 = vec1.asDiagonal();</div> </div><!-- fragment --> </td></tr> <tr> <td>Declare a diagonal matrix</td><td><div class="fragment"><div class="line">DiagonalMatrix<Scalar,SizeAtCompileTime> diag1(size);</div> <div class="line">diag1.diagonal() = vector;</div> </div><!-- fragment --> </td></tr> <tr> <td>Access the <a class="el" href="classEigen_1_1MatrixBase.html#a0a45dd0ed5a44ec3f8f43239f2e4ac25">diagonal </a> and <a class="el" href="classEigen_1_1MatrixBase.html#a18f8f447d5f4bd633df62a012f84df18">super/sub diagonals </a> of a matrix as a vector (read/write) </td><td><div class="fragment"><div class="line">vec1 = mat1.diagonal(); mat1.diagonal() = vec1; <span class="comment">// main diagonal</span></div> <div class="line">vec1 = mat1.diagonal(+n); mat1.diagonal(+n) = vec1; <span class="comment">// n-th super diagonal</span></div> <div class="line">vec1 = mat1.diagonal(-n); mat1.diagonal(-n) = vec1; <span class="comment">// n-th sub diagonal</span></div> <div class="line">vec1 = mat1.diagonal<1>(); mat1.diagonal<1>() = vec1; <span class="comment">// first super diagonal</span></div> <div class="line">vec1 = mat1.diagonal<-2>(); mat1.diagonal<-2>() = vec1; <span class="comment">// second sub diagonal</span></div> </div><!-- fragment --> <p class="endtd"></p> </td></tr> <tr> <td>Optimized products and inverse </td><td><div class="fragment"><div class="line">mat3 = scalar * diag1 * mat1;</div> <div class="line">mat3 += scalar * mat1 * vec1.asDiagonal();</div> <div class="line">mat3 = vec1.asDiagonal().inverse() * mat1</div> <div class="line">mat3 = mat1 * diag1.inverse()</div> </div><!-- fragment --> <p class="endtd"></p> </td></tr> </table> <h2><a class="anchor" id="QuickRef_TriangularView"></a> Triangular views</h2> <p><a class="el" href="classEigen_1_1TriangularView.html" title="Base class for triangular part in a matrix. ">TriangularView</a> gives a view on a triangular part of a dense matrix and allows to perform optimized operations on it. The opposite triangular part is never referenced and can be used to store other information.</p> <dl class="section note"><dt>Note</dt><dd>The .triangularView() template member function requires the <code>template</code> keyword if it is used on an object of a type that depends on a template parameter; see <a class="el" href="TopicTemplateKeyword.html">The template and typename keywords in C++</a> for details.</dd></dl> <table class="example"> <tr> <th>Operation</th><th>Code </th></tr> <tr> <td>Reference to a triangular with optional <br/> unit or null diagonal (read/write): </td><td><div class="fragment"><div class="line">m.triangularView<Xxx>()</div> </div><!-- fragment --> <br/> <code>Xxx</code> = <a class="el" href="group__enums.html#ggab59c1bec446b10af208f977a871d910bae70afef0d3ff7aca74e17e85ff6c9f2e">Upper</a>, <a class="el" href="group__enums.html#ggab59c1bec446b10af208f977a871d910baf886b397626076218462d53d50eb96bc">Lower</a>, <a class="el" href="group__enums.html#ggab59c1bec446b10af208f977a871d910babf11791f004a059cfdd9b941c76f3703">StrictlyUpper</a>, <a class="el" href="group__enums.html#ggab59c1bec446b10af208f977a871d910ba29eb98bd08096415c55f37ed4ac2af11">StrictlyLower</a>, <a class="el" href="group__enums.html#ggab59c1bec446b10af208f977a871d910ba65b1d67b2bb2e4a85b5f6a8863cd7109">UnitUpper</a>, <a class="el" href="group__enums.html#ggab59c1bec446b10af208f977a871d910ba0dc6c411b3fc7ae6e32860a7872b7d18">UnitLower</a> </td></tr> <tr> <td>Writing to a specific triangular part:<br/> (only the referenced triangular part is evaluated) </td><td><div class="fragment"><div class="line">m1.triangularView<<a class="code" href="group__enums.html#ggab59c1bec446b10af208f977a871d910baf886b397626076218462d53d50eb96bc">Eigen::Lower</a>>() = m2 + m3 </div> </div><!-- fragment --> </td></tr> <tr> <td>Conversion to a dense matrix setting the opposite triangular part to zero: </td><td><div class="fragment"><div class="line">m2 = m1.triangularView<<a class="code" href="group__enums.html#ggab59c1bec446b10af208f977a871d910ba65b1d67b2bb2e4a85b5f6a8863cd7109">Eigen::UnitUpper</a>>()</div> </div><!-- fragment --> </td></tr> <tr> <td>Products: </td><td><div class="fragment"><div class="line">m3 += s1 * m1.adjoint().triangularView<<a class="code" href="group__enums.html#ggab59c1bec446b10af208f977a871d910ba65b1d67b2bb2e4a85b5f6a8863cd7109">Eigen::UnitUpper</a>>() * m2</div> <div class="line">m3 -= s1 * m2.conjugate() * m1.adjoint().triangularView<<a class="code" href="group__enums.html#ggab59c1bec446b10af208f977a871d910baf886b397626076218462d53d50eb96bc">Eigen::Lower</a>>() </div> </div><!-- fragment --> </td></tr> <tr> <td>Solving linear equations:<br/> <img class="formulaInl" alt="$ M_2 := L_1^{-1} M_2 $" src="form_168.png"/> <br/> <img class="formulaInl" alt="$ M_3 := {L_1^*}^{-1} M_3 $" src="form_169.png"/> <br/> <img class="formulaInl" alt="$ M_4 := M_4 U_1^{-1} $" src="form_170.png"/> </td><td><br/> <div class="fragment"><div class="line">L1.triangularView<<a class="code" href="group__enums.html#ggab59c1bec446b10af208f977a871d910ba0dc6c411b3fc7ae6e32860a7872b7d18">Eigen::UnitLower</a>>().solveInPlace(M2)</div> <div class="line">L1.triangularView<Eigen::<a class="code" href="group__enums.html#ggab59c1bec446b10af208f977a871d910baf886b397626076218462d53d50eb96bc">Lower</a>>().adjoint().solveInPlace(M3)</div> <div class="line">U1.triangularView<Eigen::<a class="code" href="group__enums.html#ggab59c1bec446b10af208f977a871d910bae70afef0d3ff7aca74e17e85ff6c9f2e">Upper</a>>().solveInPlace<<a class="code" href="group__enums.html#gga3f4a95405348aa63ef907e692901011faeda0d7b1859ec757de18ee3b7c6c541c">OnTheRight</a>>(M4)</div> </div><!-- fragment --> </td></tr> </table> <h2><a class="anchor" id="QuickRef_SelfadjointMatrix"></a> Symmetric/selfadjoint views</h2> <p>Just as for triangular matrix, you can reference any triangular part of a square matrix to see it as a selfadjoint matrix and perform special and optimized operations. Again the opposite triangular part is never referenced and can be used to store other information.</p> <dl class="section note"><dt>Note</dt><dd>The .selfadjointView() template member function requires the <code>template</code> keyword if it is used on an object of a type that depends on a template parameter; see <a class="el" href="TopicTemplateKeyword.html">The template and typename keywords in C++</a> for details.</dd></dl> <table class="example"> <tr> <th>Operation</th><th>Code </th></tr> <tr> <td>Conversion to a dense matrix: </td><td><div class="fragment"><div class="line">m2 = m.selfadjointView<<a class="code" href="group__enums.html#ggab59c1bec446b10af208f977a871d910baf886b397626076218462d53d50eb96bc">Eigen::Lower</a>>();</div> </div><!-- fragment --> </td></tr> <tr> <td>Product with another general matrix or vector: </td><td><div class="fragment"><div class="line">m3 = s1 * m1.conjugate().selfadjointView<<a class="code" href="group__enums.html#ggab59c1bec446b10af208f977a871d910bae70afef0d3ff7aca74e17e85ff6c9f2e">Eigen::Upper</a>>() * m3;</div> <div class="line">m3 -= s1 * m3.adjoint() * m1.selfadjointView<<a class="code" href="group__enums.html#ggab59c1bec446b10af208f977a871d910baf886b397626076218462d53d50eb96bc">Eigen::Lower</a>>();</div> </div><!-- fragment --> </td></tr> <tr> <td>Rank 1 and rank K update: <br/> <img class="formulaInl" alt="$ upper(M_1) \mathrel{{+}{=}} s_1 M_2 M_2^* $" src="form_171.png"/> <br/> <img class="formulaInl" alt="$ lower(M_1) \mathbin{{-}{=}} M_2^* M_2 $" src="form_172.png"/> </td><td><br/> <div class="fragment"><div class="line">M1.selfadjointView<<a class="code" href="group__enums.html#ggab59c1bec446b10af208f977a871d910bae70afef0d3ff7aca74e17e85ff6c9f2e">Eigen::Upper</a>>().rankUpdate(M2,s1);</div> <div class="line">M1.selfadjointView<<a class="code" href="group__enums.html#ggab59c1bec446b10af208f977a871d910baf886b397626076218462d53d50eb96bc">Eigen::Lower</a>>().rankUpdate(M2.adjoint(),-1); </div> </div><!-- fragment --> </td></tr> <tr> <td>Rank 2 update: ( <img class="formulaInl" alt="$ M \mathrel{{+}{=}} s u v^* + s v u^* $" src="form_173.png"/>) </td><td><div class="fragment"><div class="line">M.selfadjointView<<a class="code" href="group__enums.html#ggab59c1bec446b10af208f977a871d910bae70afef0d3ff7aca74e17e85ff6c9f2e">Eigen::Upper</a>>().rankUpdate(u,v,s);</div> </div><!-- fragment --> </td></tr> <tr> <td>Solving linear equations:<br/> ( <img class="formulaInl" alt="$ M_2 := M_1^{-1} M_2 $" src="form_174.png"/>) </td><td><div class="fragment"><div class="line"><span class="comment">// via a standard Cholesky factorization</span></div> <div class="line">m2 = m1.selfadjointView<<a class="code" href="group__enums.html#ggab59c1bec446b10af208f977a871d910bae70afef0d3ff7aca74e17e85ff6c9f2e">Eigen::Upper</a>>().llt().solve(m2);</div> <div class="line"><span class="comment">// via a Cholesky factorization with pivoting</span></div> <div class="line">m2 = m1.selfadjointView<<a class="code" href="group__enums.html#ggab59c1bec446b10af208f977a871d910baf886b397626076218462d53d50eb96bc">Eigen::Lower</a>>().ldlt().solve(m2);</div> </div><!-- fragment --> </td></tr> </table> </div><!-- contents --> </div><!-- doc-content --> <!-- start footer part --> <div id="nav-path" class="navpath"><!-- id is needed for treeview function! --> <ul> <li class="footer">Generated on Mon Oct 28 2013 11:04:27 for Eigen by <a href="http://www.doxygen.org/index.html"> <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.5 </li> </ul> </div> <!-- Piwik --> <!-- <script type="text/javascript"> var pkBaseURL = (("https:" == document.location.protocol) ? "https://stats.sylphide-consulting.com/piwik/" : "http://stats.sylphide-consulting.com/piwik/"); document.write(unescape("%3Cscript src='" + pkBaseURL + "piwik.js' type='text/javascript'%3E%3C/script%3E")); </script><script type="text/javascript"> try { var piwikTracker = Piwik.getTracker(pkBaseURL + "piwik.php", 20); piwikTracker.trackPageView(); piwikTracker.enableLinkTracking(); } catch( err ) {} </script><noscript><p><img src="http://stats.sylphide-consulting.com/piwik/piwik.php?idsite=20" style="border:0" alt="" /></p></noscript> --> <!-- End Piwik Tracking Code --> </body> </html>