<!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: SelfAdjointEigenSolver.h Source File</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('SelfAdjointEigenSolver_8h_source.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">SelfAdjointEigenSolver.h</div> </div> </div><!--header--> <div class="contents"> <div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> <span class="comment">// This file is part of Eigen, a lightweight C++ template library</span></div> <div class="line"><a name="l00002"></a><span class="lineno"> 2</span> <span class="comment">// for linear algebra.</span></div> <div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="comment">//</span></div> <div class="line"><a name="l00004"></a><span class="lineno"> 4</span> <span class="comment">// Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud@inria.fr></span></div> <div class="line"><a name="l00005"></a><span class="lineno"> 5</span> <span class="comment">// Copyright (C) 2010 Jitse Niesen <jitse@maths.leeds.ac.uk></span></div> <div class="line"><a name="l00006"></a><span class="lineno"> 6</span> <span class="comment">//</span></div> <div class="line"><a name="l00007"></a><span class="lineno"> 7</span> <span class="comment">// This Source Code Form is subject to the terms of the Mozilla</span></div> <div class="line"><a name="l00008"></a><span class="lineno"> 8</span> <span class="comment">// Public License v. 2.0. If a copy of the MPL was not distributed</span></div> <div class="line"><a name="l00009"></a><span class="lineno"> 9</span> <span class="comment">// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.</span></div> <div class="line"><a name="l00010"></a><span class="lineno"> 10</span> </div> <div class="line"><a name="l00011"></a><span class="lineno"> 11</span> <span class="preprocessor">#ifndef EIGEN_SELFADJOINTEIGENSOLVER_H</span></div> <div class="line"><a name="l00012"></a><span class="lineno"> 12</span> <span class="preprocessor"></span><span class="preprocessor">#define EIGEN_SELFADJOINTEIGENSOLVER_H</span></div> <div class="line"><a name="l00013"></a><span class="lineno"> 13</span> <span class="preprocessor"></span></div> <div class="line"><a name="l00014"></a><span class="lineno"> 14</span> <span class="preprocessor">#include "./Tridiagonalization.h"</span></div> <div class="line"><a name="l00015"></a><span class="lineno"> 15</span> </div> <div class="line"><a name="l00016"></a><span class="lineno"> 16</span> <span class="keyword">namespace </span>Eigen { </div> <div class="line"><a name="l00017"></a><span class="lineno"> 17</span> </div> <div class="line"><a name="l00018"></a><span class="lineno"> 18</span> <span class="keyword">template</span><<span class="keyword">typename</span> _MatrixType></div> <div class="line"><a name="l00019"></a><span class="lineno"> 19</span> <span class="keyword">class </span>GeneralizedSelfAdjointEigenSolver;</div> <div class="line"><a name="l00020"></a><span class="lineno"> 20</span> </div> <div class="line"><a name="l00021"></a><span class="lineno"> 21</span> <span class="keyword">namespace </span>internal {</div> <div class="line"><a name="l00022"></a><span class="lineno"> 22</span> <span class="keyword">template</span><<span class="keyword">typename</span> SolverType,<span class="keywordtype">int</span> Size,<span class="keywordtype">bool</span> IsComplex> <span class="keyword">struct </span>direct_selfadjoint_eigenvalues;</div> <div class="line"><a name="l00023"></a><span class="lineno"> 23</span> }</div> <div class="line"><a name="l00024"></a><span class="lineno"> 24</span> </div> <div class="line"><a name="l00068"></a><span class="lineno"><a class="line" href="classEigen_1_1SelfAdjointEigenSolver.html"> 68</a></span> <span class="keyword">template</span><<span class="keyword">typename</span> _MatrixType> <span class="keyword">class </span><a class="code" href="classEigen_1_1SelfAdjointEigenSolver.html">SelfAdjointEigenSolver</a></div> <div class="line"><a name="l00069"></a><span class="lineno"> 69</span> {</div> <div class="line"><a name="l00070"></a><span class="lineno"> 70</span>  <span class="keyword">public</span>:</div> <div class="line"><a name="l00071"></a><span class="lineno"> 71</span> </div> <div class="line"><a name="l00072"></a><span class="lineno"> 72</span>  <span class="keyword">typedef</span> _MatrixType MatrixType;</div> <div class="line"><a name="l00073"></a><span class="lineno"> 73</span>  <span class="keyword">enum</span> {</div> <div class="line"><a name="l00074"></a><span class="lineno"> 74</span>  Size = MatrixType::RowsAtCompileTime,</div> <div class="line"><a name="l00075"></a><span class="lineno"> 75</span>  ColsAtCompileTime = MatrixType::ColsAtCompileTime,</div> <div class="line"><a name="l00076"></a><span class="lineno"> 76</span>  Options = MatrixType::Options,</div> <div class="line"><a name="l00077"></a><span class="lineno"> 77</span>  MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime</div> <div class="line"><a name="l00078"></a><span class="lineno"> 78</span>  };</div> <div class="line"><a name="l00079"></a><span class="lineno"> 79</span>  </div> <div class="line"><a name="l00081"></a><span class="lineno"><a class="line" href="classEigen_1_1SelfAdjointEigenSolver.html#a3f6fc00047c205ee590f676934aab28f"> 81</a></span>  <span class="keyword">typedef</span> <span class="keyword">typename</span> MatrixType::Scalar <a class="code" href="classEigen_1_1SelfAdjointEigenSolver.html#a3f6fc00047c205ee590f676934aab28f">Scalar</a>;</div> <div class="line"><a name="l00082"></a><span class="lineno"> 82</span>  <span class="keyword">typedef</span> <span class="keyword">typename</span> MatrixType::Index Index;</div> <div class="line"><a name="l00083"></a><span class="lineno"> 83</span> </div> <div class="line"><a name="l00090"></a><span class="lineno"><a class="line" href="classEigen_1_1SelfAdjointEigenSolver.html#acb5c3dc237f99cf17167e8a629f01b43"> 90</a></span>  <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="structEigen_1_1NumTraits.html">NumTraits<Scalar>::Real</a> <a class="code" href="classEigen_1_1SelfAdjointEigenSolver.html#acb5c3dc237f99cf17167e8a629f01b43">RealScalar</a>;</div> <div class="line"><a name="l00091"></a><span class="lineno"> 91</span>  </div> <div class="line"><a name="l00092"></a><span class="lineno"> 92</span>  <span class="keyword">friend</span> <span class="keyword">struct </span>internal::direct_selfadjoint_eigenvalues<<a class="code" href="classEigen_1_1SelfAdjointEigenSolver.html">SelfAdjointEigenSolver</a>,Size,<a class="code" href="structEigen_1_1NumTraits.html">NumTraits</a><<a class="code" href="classEigen_1_1SelfAdjointEigenSolver.html#a3f6fc00047c205ee590f676934aab28f">Scalar</a>>::IsComplex>;</div> <div class="line"><a name="l00093"></a><span class="lineno"> 93</span> </div> <div class="line"><a name="l00099"></a><span class="lineno"><a class="line" href="classEigen_1_1SelfAdjointEigenSolver.html#a4e33b38d1980864e689a8a1c01b782dd"> 99</a></span>  typedef typename internal::plain_col_type<MatrixType, RealScalar>::type <a class="code" href="classEigen_1_1SelfAdjointEigenSolver.html#a4e33b38d1980864e689a8a1c01b782dd">RealVectorType</a>;</div> <div class="line"><a name="l00100"></a><span class="lineno"> 100</span>  typedef <a class="code" href="classEigen_1_1Tridiagonalization.html">Tridiagonalization</a><MatrixType> <a class="code" href="classEigen_1_1Tridiagonalization.html">TridiagonalizationType</a>;</div> <div class="line"><a name="l00101"></a><span class="lineno"> 101</span> </div> <div class="line"><a name="l00112"></a><span class="lineno"><a class="line" href="classEigen_1_1SelfAdjointEigenSolver.html#a4cd23cc2295a3daa079898bd4b9b3d4d"> 112</a></span>  <a class="code" href="classEigen_1_1SelfAdjointEigenSolver.html">SelfAdjointEigenSolver</a>()</div> <div class="line"><a name="l00113"></a><span class="lineno"> 113</span>  : m_eivec(),</div> <div class="line"><a name="l00114"></a><span class="lineno"> 114</span>  m_eivalues(),</div> <div class="line"><a name="l00115"></a><span class="lineno"> 115</span>  m_subdiag(),</div> <div class="line"><a name="l00116"></a><span class="lineno"> 116</span>  m_isInitialized(false)</div> <div class="line"><a name="l00117"></a><span class="lineno"> 117</span>  { }</div> <div class="line"><a name="l00118"></a><span class="lineno"> 118</span> </div> <div class="line"><a name="l00131"></a><span class="lineno"><a class="line" href="classEigen_1_1SelfAdjointEigenSolver.html#afacfaa11c727d3043d525f577b22c524"> 131</a></span>  <a class="code" href="classEigen_1_1SelfAdjointEigenSolver.html#afacfaa11c727d3043d525f577b22c524">SelfAdjointEigenSolver</a>(Index size)</div> <div class="line"><a name="l00132"></a><span class="lineno"> 132</span>  : m_eivec(size, size),</div> <div class="line"><a name="l00133"></a><span class="lineno"> 133</span>  m_eivalues(size),</div> <div class="line"><a name="l00134"></a><span class="lineno"> 134</span>  m_subdiag(size > 1 ? size - 1 : 1),</div> <div class="line"><a name="l00135"></a><span class="lineno"> 135</span>  m_isInitialized(false)</div> <div class="line"><a name="l00136"></a><span class="lineno"> 136</span>  {}</div> <div class="line"><a name="l00137"></a><span class="lineno"> 137</span> </div> <div class="line"><a name="l00153"></a><span class="lineno"><a class="line" href="classEigen_1_1SelfAdjointEigenSolver.html#a30caf3c3884a7f4a46b8ec94efd23c5e"> 153</a></span>  <a class="code" href="classEigen_1_1SelfAdjointEigenSolver.html#a30caf3c3884a7f4a46b8ec94efd23c5e">SelfAdjointEigenSolver</a>(<span class="keyword">const</span> MatrixType& matrix, <span class="keywordtype">int</span> options = <a class="code" href="group__enums.html#gga2d78499b99ddc29b9494f7ea33864d52a92a556ff1203acee3bacb02b0d157870">ComputeEigenvectors</a>)</div> <div class="line"><a name="l00154"></a><span class="lineno"> 154</span>  : m_eivec(matrix.rows(), matrix.cols()),</div> <div class="line"><a name="l00155"></a><span class="lineno"> 155</span>  m_eivalues(matrix.cols()),</div> <div class="line"><a name="l00156"></a><span class="lineno"> 156</span>  m_subdiag(matrix.rows() > 1 ? matrix.rows() - 1 : 1),</div> <div class="line"><a name="l00157"></a><span class="lineno"> 157</span>  m_isInitialized(false)</div> <div class="line"><a name="l00158"></a><span class="lineno"> 158</span>  {</div> <div class="line"><a name="l00159"></a><span class="lineno"> 159</span>  <a class="code" href="classEigen_1_1SelfAdjointEigenSolver.html#aff6f3679ffb0098b33ccdefd4c5aaf33">compute</a>(matrix, options);</div> <div class="line"><a name="l00160"></a><span class="lineno"> 160</span>  }</div> <div class="line"><a name="l00161"></a><span class="lineno"> 161</span> </div> <div class="line"><a name="l00192"></a><span class="lineno"> 192</span>  <a class="code" href="classEigen_1_1SelfAdjointEigenSolver.html">SelfAdjointEigenSolver</a>& <a class="code" href="classEigen_1_1SelfAdjointEigenSolver.html#aff6f3679ffb0098b33ccdefd4c5aaf33">compute</a>(<span class="keyword">const</span> MatrixType& matrix, <span class="keywordtype">int</span> options = <a class="code" href="group__enums.html#gga2d78499b99ddc29b9494f7ea33864d52a92a556ff1203acee3bacb02b0d157870">ComputeEigenvectors</a>);</div> <div class="line"><a name="l00193"></a><span class="lineno"> 193</span>  </div> <div class="line"><a name="l00208"></a><span class="lineno"> 208</span>  <a class="code" href="classEigen_1_1SelfAdjointEigenSolver.html">SelfAdjointEigenSolver</a>& <a class="code" href="classEigen_1_1SelfAdjointEigenSolver.html#a85cda7e77edf4923f3fc0512c83f6323">computeDirect</a>(<span class="keyword">const</span> MatrixType& matrix, <span class="keywordtype">int</span> options = <a class="code" href="group__enums.html#gga2d78499b99ddc29b9494f7ea33864d52a92a556ff1203acee3bacb02b0d157870">ComputeEigenvectors</a>);</div> <div class="line"><a name="l00209"></a><span class="lineno"> 209</span> </div> <div class="line"><a name="l00228"></a><span class="lineno"><a class="line" href="classEigen_1_1SelfAdjointEigenSolver.html#a647a30aac0c6bb3def117dfb5ce90035"> 228</a></span>  <span class="keyword">const</span> MatrixType& <a class="code" href="classEigen_1_1SelfAdjointEigenSolver.html#a647a30aac0c6bb3def117dfb5ce90035">eigenvectors</a>()<span class="keyword"> const</span></div> <div class="line"><a name="l00229"></a><span class="lineno"> 229</span> <span class="keyword"> </span>{</div> <div class="line"><a name="l00230"></a><span class="lineno"> 230</span>  eigen_assert(m_isInitialized && <span class="stringliteral">"SelfAdjointEigenSolver is not initialized."</span>);</div> <div class="line"><a name="l00231"></a><span class="lineno"> 231</span>  eigen_assert(m_eigenvectorsOk && <span class="stringliteral">"The eigenvectors have not been computed together with the eigenvalues."</span>);</div> <div class="line"><a name="l00232"></a><span class="lineno"> 232</span>  <span class="keywordflow">return</span> m_eivec;</div> <div class="line"><a name="l00233"></a><span class="lineno"> 233</span>  }</div> <div class="line"><a name="l00234"></a><span class="lineno"> 234</span> </div> <div class="line"><a name="l00250"></a><span class="lineno"><a class="line" href="classEigen_1_1SelfAdjointEigenSolver.html#af54b25fe7d2a3f578269381e9e5592a2"> 250</a></span>  <span class="keyword">const</span> <a class="code" href="classEigen_1_1SelfAdjointEigenSolver.html#a4e33b38d1980864e689a8a1c01b782dd">RealVectorType</a>& <a class="code" href="classEigen_1_1SelfAdjointEigenSolver.html#af54b25fe7d2a3f578269381e9e5592a2">eigenvalues</a>()<span class="keyword"> const</span></div> <div class="line"><a name="l00251"></a><span class="lineno"> 251</span> <span class="keyword"> </span>{</div> <div class="line"><a name="l00252"></a><span class="lineno"> 252</span>  eigen_assert(m_isInitialized && <span class="stringliteral">"SelfAdjointEigenSolver is not initialized."</span>);</div> <div class="line"><a name="l00253"></a><span class="lineno"> 253</span>  <span class="keywordflow">return</span> m_eivalues;</div> <div class="line"><a name="l00254"></a><span class="lineno"> 254</span>  }</div> <div class="line"><a name="l00255"></a><span class="lineno"> 255</span> </div> <div class="line"><a name="l00274"></a><span class="lineno"><a class="line" href="classEigen_1_1SelfAdjointEigenSolver.html#add23e44f8a7f540c288ee98b2d2b0775"> 274</a></span>  MatrixType <a class="code" href="classEigen_1_1SelfAdjointEigenSolver.html#add23e44f8a7f540c288ee98b2d2b0775">operatorSqrt</a>()<span class="keyword"> const</span></div> <div class="line"><a name="l00275"></a><span class="lineno"> 275</span> <span class="keyword"> </span>{</div> <div class="line"><a name="l00276"></a><span class="lineno"> 276</span>  eigen_assert(m_isInitialized && <span class="stringliteral">"SelfAdjointEigenSolver is not initialized."</span>);</div> <div class="line"><a name="l00277"></a><span class="lineno"> 277</span>  eigen_assert(m_eigenvectorsOk && <span class="stringliteral">"The eigenvectors have not been computed together with the eigenvalues."</span>);</div> <div class="line"><a name="l00278"></a><span class="lineno"> 278</span>  <span class="keywordflow">return</span> m_eivec * m_eivalues.cwiseSqrt().asDiagonal() * m_eivec.adjoint();</div> <div class="line"><a name="l00279"></a><span class="lineno"> 279</span>  }</div> <div class="line"><a name="l00280"></a><span class="lineno"> 280</span> </div> <div class="line"><a name="l00299"></a><span class="lineno"><a class="line" href="classEigen_1_1SelfAdjointEigenSolver.html#a811ad0873e06be5404fc91f64f0f658d"> 299</a></span>  MatrixType <a class="code" href="classEigen_1_1SelfAdjointEigenSolver.html#a811ad0873e06be5404fc91f64f0f658d">operatorInverseSqrt</a>()<span class="keyword"> const</span></div> <div class="line"><a name="l00300"></a><span class="lineno"> 300</span> <span class="keyword"> </span>{</div> <div class="line"><a name="l00301"></a><span class="lineno"> 301</span>  eigen_assert(m_isInitialized && <span class="stringliteral">"SelfAdjointEigenSolver is not initialized."</span>);</div> <div class="line"><a name="l00302"></a><span class="lineno"> 302</span>  eigen_assert(m_eigenvectorsOk && <span class="stringliteral">"The eigenvectors have not been computed together with the eigenvalues."</span>);</div> <div class="line"><a name="l00303"></a><span class="lineno"> 303</span>  <span class="keywordflow">return</span> m_eivec * m_eivalues.cwiseInverse().cwiseSqrt().asDiagonal() * m_eivec.adjoint();</div> <div class="line"><a name="l00304"></a><span class="lineno"> 304</span>  }</div> <div class="line"><a name="l00305"></a><span class="lineno"> 305</span> </div> <div class="line"><a name="l00310"></a><span class="lineno"><a class="line" href="classEigen_1_1SelfAdjointEigenSolver.html#a0c06d5c2034ebb329c54235369643ad2"> 310</a></span>  <a class="code" href="group__enums.html#ga51bc1ac16f26ebe51eae1abb77bd037b">ComputationInfo</a> <a class="code" href="classEigen_1_1SelfAdjointEigenSolver.html#a0c06d5c2034ebb329c54235369643ad2">info</a>()<span class="keyword"> const</span></div> <div class="line"><a name="l00311"></a><span class="lineno"> 311</span> <span class="keyword"> </span>{</div> <div class="line"><a name="l00312"></a><span class="lineno"> 312</span>  eigen_assert(m_isInitialized && <span class="stringliteral">"SelfAdjointEigenSolver is not initialized."</span>);</div> <div class="line"><a name="l00313"></a><span class="lineno"> 313</span>  <span class="keywordflow">return</span> m_info;</div> <div class="line"><a name="l00314"></a><span class="lineno"> 314</span>  }</div> <div class="line"><a name="l00315"></a><span class="lineno"> 315</span> </div> <div class="line"><a name="l00321"></a><span class="lineno"><a class="line" href="classEigen_1_1SelfAdjointEigenSolver.html#adc66cd724d769ca37c38bc5ecb06dd87"> 321</a></span>  <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">int</span> <a class="code" href="classEigen_1_1SelfAdjointEigenSolver.html#adc66cd724d769ca37c38bc5ecb06dd87">m_maxIterations</a> = 30;</div> <div class="line"><a name="l00322"></a><span class="lineno"> 322</span> </div> <div class="line"><a name="l00323"></a><span class="lineno"> 323</span> <span class="preprocessor"> #ifdef EIGEN2_SUPPORT</span></div> <div class="line"><a name="l00324"></a><span class="lineno"> 324</span> <span class="preprocessor"></span> <a class="code" href="classEigen_1_1SelfAdjointEigenSolver.html#a4cd23cc2295a3daa079898bd4b9b3d4d">SelfAdjointEigenSolver</a>(<span class="keyword">const</span> MatrixType& matrix, <span class="keywordtype">bool</span> computeEigenvectors)</div> <div class="line"><a name="l00325"></a><span class="lineno"> 325</span>  : m_eivec(matrix.rows(), matrix.cols()),</div> <div class="line"><a name="l00326"></a><span class="lineno"> 326</span>  m_eivalues(matrix.cols()),</div> <div class="line"><a name="l00327"></a><span class="lineno"> 327</span>  m_subdiag(matrix.rows() > 1 ? matrix.rows() - 1 : 1),</div> <div class="line"><a name="l00328"></a><span class="lineno"> 328</span>  m_isInitialized(false)</div> <div class="line"><a name="l00329"></a><span class="lineno"> 329</span>  {</div> <div class="line"><a name="l00330"></a><span class="lineno"> 330</span>  <a class="code" href="classEigen_1_1SelfAdjointEigenSolver.html#aff6f3679ffb0098b33ccdefd4c5aaf33">compute</a>(matrix, computeEigenvectors);</div> <div class="line"><a name="l00331"></a><span class="lineno"> 331</span>  }</div> <div class="line"><a name="l00332"></a><span class="lineno"> 332</span>  </div> <div class="line"><a name="l00333"></a><span class="lineno"> 333</span>  <a class="code" href="classEigen_1_1SelfAdjointEigenSolver.html#a4cd23cc2295a3daa079898bd4b9b3d4d">SelfAdjointEigenSolver</a>(<span class="keyword">const</span> MatrixType& matA, <span class="keyword">const</span> MatrixType& matB, <span class="keywordtype">bool</span> computeEigenvectors = <span class="keyword">true</span>)</div> <div class="line"><a name="l00334"></a><span class="lineno"> 334</span>  : m_eivec(matA.cols(), matA.cols()),</div> <div class="line"><a name="l00335"></a><span class="lineno"> 335</span>  m_eivalues(matA.cols()),</div> <div class="line"><a name="l00336"></a><span class="lineno"> 336</span>  m_subdiag(matA.cols() > 1 ? matA.cols() - 1 : 1),</div> <div class="line"><a name="l00337"></a><span class="lineno"> 337</span>  m_isInitialized(false)</div> <div class="line"><a name="l00338"></a><span class="lineno"> 338</span>  {</div> <div class="line"><a name="l00339"></a><span class="lineno"> 339</span>  <span class="keyword">static_cast<</span><a class="code" href="classEigen_1_1GeneralizedSelfAdjointEigenSolver.html">GeneralizedSelfAdjointEigenSolver<MatrixType></a>*<span class="keyword">></span>(<span class="keyword">this</span>)-><a class="code" href="classEigen_1_1SelfAdjointEigenSolver.html#aff6f3679ffb0098b33ccdefd4c5aaf33">compute</a>(matA, matB, computeEigenvectors ? <a class="code" href="group__enums.html#gga2d78499b99ddc29b9494f7ea33864d52a92a556ff1203acee3bacb02b0d157870">ComputeEigenvectors</a> : <a class="code" href="group__enums.html#gga2d78499b99ddc29b9494f7ea33864d52adaf09d7c7a09d6c882b1a871268e87dd">EigenvaluesOnly</a>);</div> <div class="line"><a name="l00340"></a><span class="lineno"> 340</span>  }</div> <div class="line"><a name="l00341"></a><span class="lineno"> 341</span>  </div> <div class="line"><a name="l00342"></a><span class="lineno"> 342</span>  <span class="keywordtype">void</span> <a class="code" href="classEigen_1_1SelfAdjointEigenSolver.html#aff6f3679ffb0098b33ccdefd4c5aaf33">compute</a>(<span class="keyword">const</span> MatrixType& matrix, <span class="keywordtype">bool</span> computeEigenvectors)</div> <div class="line"><a name="l00343"></a><span class="lineno"> 343</span>  {</div> <div class="line"><a name="l00344"></a><span class="lineno"> 344</span>  <a class="code" href="classEigen_1_1SelfAdjointEigenSolver.html#aff6f3679ffb0098b33ccdefd4c5aaf33">compute</a>(matrix, computeEigenvectors ? <a class="code" href="group__enums.html#gga2d78499b99ddc29b9494f7ea33864d52a92a556ff1203acee3bacb02b0d157870">ComputeEigenvectors</a> : <a class="code" href="group__enums.html#gga2d78499b99ddc29b9494f7ea33864d52adaf09d7c7a09d6c882b1a871268e87dd">EigenvaluesOnly</a>);</div> <div class="line"><a name="l00345"></a><span class="lineno"> 345</span>  }</div> <div class="line"><a name="l00346"></a><span class="lineno"> 346</span> </div> <div class="line"><a name="l00347"></a><span class="lineno"> 347</span>  <span class="keywordtype">void</span> <a class="code" href="classEigen_1_1SelfAdjointEigenSolver.html#aff6f3679ffb0098b33ccdefd4c5aaf33">compute</a>(<span class="keyword">const</span> MatrixType& matA, <span class="keyword">const</span> MatrixType& matB, <span class="keywordtype">bool</span> computeEigenvectors = <span class="keyword">true</span>)</div> <div class="line"><a name="l00348"></a><span class="lineno"> 348</span>  {</div> <div class="line"><a name="l00349"></a><span class="lineno"> 349</span>  <a class="code" href="classEigen_1_1SelfAdjointEigenSolver.html#aff6f3679ffb0098b33ccdefd4c5aaf33">compute</a>(matA, matB, computeEigenvectors ? <a class="code" href="group__enums.html#gga2d78499b99ddc29b9494f7ea33864d52a92a556ff1203acee3bacb02b0d157870">ComputeEigenvectors</a> : <a class="code" href="group__enums.html#gga2d78499b99ddc29b9494f7ea33864d52adaf09d7c7a09d6c882b1a871268e87dd">EigenvaluesOnly</a>);</div> <div class="line"><a name="l00350"></a><span class="lineno"> 350</span>  }</div> <div class="line"><a name="l00351"></a><span class="lineno"> 351</span> <span class="preprocessor"> #endif // EIGEN2_SUPPORT</span></div> <div class="line"><a name="l00352"></a><span class="lineno"> 352</span> <span class="preprocessor"></span></div> <div class="line"><a name="l00353"></a><span class="lineno"> 353</span>  <span class="keyword">protected</span>:</div> <div class="line"><a name="l00354"></a><span class="lineno"> 354</span>  MatrixType m_eivec;</div> <div class="line"><a name="l00355"></a><span class="lineno"> 355</span>  <a class="code" href="classEigen_1_1SelfAdjointEigenSolver.html#a4e33b38d1980864e689a8a1c01b782dd">RealVectorType</a> m_eivalues;</div> <div class="line"><a name="l00356"></a><span class="lineno"> 356</span>  <span class="keyword">typename</span> TridiagonalizationType::SubDiagonalType m_subdiag;</div> <div class="line"><a name="l00357"></a><span class="lineno"> 357</span>  <a class="code" href="group__enums.html#ga51bc1ac16f26ebe51eae1abb77bd037b">ComputationInfo</a> m_info;</div> <div class="line"><a name="l00358"></a><span class="lineno"> 358</span>  <span class="keywordtype">bool</span> m_isInitialized;</div> <div class="line"><a name="l00359"></a><span class="lineno"> 359</span>  <span class="keywordtype">bool</span> m_eigenvectorsOk;</div> <div class="line"><a name="l00360"></a><span class="lineno"> 360</span> };</div> <div class="line"><a name="l00361"></a><span class="lineno"> 361</span> </div> <div class="line"><a name="l00378"></a><span class="lineno"> 378</span> <span class="keyword">namespace </span>internal {</div> <div class="line"><a name="l00379"></a><span class="lineno"> 379</span> <span class="keyword">template</span><<span class="keywordtype">int</span> StorageOrder,<span class="keyword">typename</span> RealScalar, <span class="keyword">typename</span> Scalar, <span class="keyword">typename</span> Index></div> <div class="line"><a name="l00380"></a><span class="lineno"> 380</span> <span class="keyword">static</span> <span class="keywordtype">void</span> tridiagonal_qr_step(RealScalar* diag, RealScalar* subdiag, Index start, Index end, Scalar* matrixQ, Index n);</div> <div class="line"><a name="l00381"></a><span class="lineno"> 381</span> }</div> <div class="line"><a name="l00382"></a><span class="lineno"> 382</span> </div> <div class="line"><a name="l00383"></a><span class="lineno"> 383</span> <span class="keyword">template</span><<span class="keyword">typename</span> MatrixType></div> <div class="line"><a name="l00384"></a><span class="lineno"> 384</span> SelfAdjointEigenSolver<MatrixType>& <a class="code" href="classEigen_1_1SelfAdjointEigenSolver.html#aff6f3679ffb0098b33ccdefd4c5aaf33">SelfAdjointEigenSolver<MatrixType></a></div> <div class="line"><a name="l00385"></a><span class="lineno"><a class="line" href="classEigen_1_1SelfAdjointEigenSolver.html#aff6f3679ffb0098b33ccdefd4c5aaf33"> 385</a></span> <a class="code" href="classEigen_1_1SelfAdjointEigenSolver.html#aff6f3679ffb0098b33ccdefd4c5aaf33">::compute</a>(<span class="keyword">const</span> MatrixType& matrix, <span class="keywordtype">int</span> options)</div> <div class="line"><a name="l00386"></a><span class="lineno"> 386</span> {</div> <div class="line"><a name="l00387"></a><span class="lineno"> 387</span>  <span class="keyword">using</span> std::abs;</div> <div class="line"><a name="l00388"></a><span class="lineno"> 388</span>  eigen_assert(matrix.cols() == matrix.rows());</div> <div class="line"><a name="l00389"></a><span class="lineno"> 389</span>  eigen_assert((options&~(EigVecMask|GenEigMask))==0</div> <div class="line"><a name="l00390"></a><span class="lineno"> 390</span>  && (options&EigVecMask)!=EigVecMask</div> <div class="line"><a name="l00391"></a><span class="lineno"> 391</span>  && <span class="stringliteral">"invalid option parameter"</span>);</div> <div class="line"><a name="l00392"></a><span class="lineno"> 392</span>  <span class="keywordtype">bool</span> computeEigenvectors = (options&<a class="code" href="group__enums.html#gga2d78499b99ddc29b9494f7ea33864d52a92a556ff1203acee3bacb02b0d157870">ComputeEigenvectors</a>)==<a class="code" href="group__enums.html#gga2d78499b99ddc29b9494f7ea33864d52a92a556ff1203acee3bacb02b0d157870">ComputeEigenvectors</a>;</div> <div class="line"><a name="l00393"></a><span class="lineno"> 393</span>  Index n = matrix.cols();</div> <div class="line"><a name="l00394"></a><span class="lineno"> 394</span>  m_eivalues.resize(n,1);</div> <div class="line"><a name="l00395"></a><span class="lineno"> 395</span> </div> <div class="line"><a name="l00396"></a><span class="lineno"> 396</span>  <span class="keywordflow">if</span>(n==1)</div> <div class="line"><a name="l00397"></a><span class="lineno"> 397</span>  {</div> <div class="line"><a name="l00398"></a><span class="lineno"> 398</span>  m_eivalues.coeffRef(0,0) = numext::real(matrix.coeff(0,0));</div> <div class="line"><a name="l00399"></a><span class="lineno"> 399</span>  <span class="keywordflow">if</span>(computeEigenvectors)</div> <div class="line"><a name="l00400"></a><span class="lineno"> 400</span>  m_eivec.setOnes(n,n);</div> <div class="line"><a name="l00401"></a><span class="lineno"> 401</span>  m_info = <a class="code" href="group__enums.html#gga51bc1ac16f26ebe51eae1abb77bd037bafdfbdf3247bd36a1f17270d5cec74c9c">Success</a>;</div> <div class="line"><a name="l00402"></a><span class="lineno"> 402</span>  m_isInitialized = <span class="keyword">true</span>;</div> <div class="line"><a name="l00403"></a><span class="lineno"> 403</span>  m_eigenvectorsOk = computeEigenvectors;</div> <div class="line"><a name="l00404"></a><span class="lineno"> 404</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div> <div class="line"><a name="l00405"></a><span class="lineno"> 405</span>  }</div> <div class="line"><a name="l00406"></a><span class="lineno"> 406</span> </div> <div class="line"><a name="l00407"></a><span class="lineno"> 407</span>  <span class="comment">// declare some aliases</span></div> <div class="line"><a name="l00408"></a><span class="lineno"> 408</span>  <a class="code" href="classEigen_1_1SelfAdjointEigenSolver.html#a4e33b38d1980864e689a8a1c01b782dd">RealVectorType</a>& diag = m_eivalues;</div> <div class="line"><a name="l00409"></a><span class="lineno"> 409</span>  MatrixType& mat = m_eivec;</div> <div class="line"><a name="l00410"></a><span class="lineno"> 410</span> </div> <div class="line"><a name="l00411"></a><span class="lineno"> 411</span>  <span class="comment">// map the matrix coefficients to [-1:1] to avoid over- and underflow.</span></div> <div class="line"><a name="l00412"></a><span class="lineno"> 412</span>  mat = matrix.template triangularView<Lower>();</div> <div class="line"><a name="l00413"></a><span class="lineno"> 413</span>  <a class="code" href="classEigen_1_1SelfAdjointEigenSolver.html#acb5c3dc237f99cf17167e8a629f01b43">RealScalar</a> scale = mat.cwiseAbs().maxCoeff();</div> <div class="line"><a name="l00414"></a><span class="lineno"> 414</span>  <span class="keywordflow">if</span>(scale==<a class="code" href="classEigen_1_1SelfAdjointEigenSolver.html#acb5c3dc237f99cf17167e8a629f01b43">RealScalar</a>(0)) scale = <a class="code" href="classEigen_1_1SelfAdjointEigenSolver.html#acb5c3dc237f99cf17167e8a629f01b43">RealScalar</a>(1);</div> <div class="line"><a name="l00415"></a><span class="lineno"> 415</span>  mat.template triangularView<Lower>() /= scale;</div> <div class="line"><a name="l00416"></a><span class="lineno"> 416</span>  m_subdiag.resize(n-1);</div> <div class="line"><a name="l00417"></a><span class="lineno"> 417</span>  internal::tridiagonalization_inplace(mat, diag, m_subdiag, computeEigenvectors);</div> <div class="line"><a name="l00418"></a><span class="lineno"> 418</span>  </div> <div class="line"><a name="l00419"></a><span class="lineno"> 419</span>  Index end = n-1;</div> <div class="line"><a name="l00420"></a><span class="lineno"> 420</span>  Index start = 0;</div> <div class="line"><a name="l00421"></a><span class="lineno"> 421</span>  Index iter = 0; <span class="comment">// total number of iterations</span></div> <div class="line"><a name="l00422"></a><span class="lineno"> 422</span> </div> <div class="line"><a name="l00423"></a><span class="lineno"> 423</span>  <span class="keywordflow">while</span> (end>0)</div> <div class="line"><a name="l00424"></a><span class="lineno"> 424</span>  {</div> <div class="line"><a name="l00425"></a><span class="lineno"> 425</span>  <span class="keywordflow">for</span> (Index i = start; i<end; ++i)</div> <div class="line"><a name="l00426"></a><span class="lineno"> 426</span>  <span class="keywordflow">if</span> (internal::isMuchSmallerThan(abs(m_subdiag[i]),(abs(diag[i])+abs(diag[i+1]))))</div> <div class="line"><a name="l00427"></a><span class="lineno"> 427</span>  m_subdiag[i] = 0;</div> <div class="line"><a name="l00428"></a><span class="lineno"> 428</span> </div> <div class="line"><a name="l00429"></a><span class="lineno"> 429</span>  <span class="comment">// find the largest unreduced block</span></div> <div class="line"><a name="l00430"></a><span class="lineno"> 430</span>  <span class="keywordflow">while</span> (end>0 && m_subdiag[end-1]==0)</div> <div class="line"><a name="l00431"></a><span class="lineno"> 431</span>  {</div> <div class="line"><a name="l00432"></a><span class="lineno"> 432</span>  end--;</div> <div class="line"><a name="l00433"></a><span class="lineno"> 433</span>  }</div> <div class="line"><a name="l00434"></a><span class="lineno"> 434</span>  <span class="keywordflow">if</span> (end<=0)</div> <div class="line"><a name="l00435"></a><span class="lineno"> 435</span>  <span class="keywordflow">break</span>;</div> <div class="line"><a name="l00436"></a><span class="lineno"> 436</span> </div> <div class="line"><a name="l00437"></a><span class="lineno"> 437</span>  <span class="comment">// if we spent too many iterations, we give up</span></div> <div class="line"><a name="l00438"></a><span class="lineno"> 438</span>  iter++;</div> <div class="line"><a name="l00439"></a><span class="lineno"> 439</span>  <span class="keywordflow">if</span>(iter > m_maxIterations * n) <span class="keywordflow">break</span>;</div> <div class="line"><a name="l00440"></a><span class="lineno"> 440</span> </div> <div class="line"><a name="l00441"></a><span class="lineno"> 441</span>  start = end - 1;</div> <div class="line"><a name="l00442"></a><span class="lineno"> 442</span>  <span class="keywordflow">while</span> (start>0 && m_subdiag[start-1]!=0)</div> <div class="line"><a name="l00443"></a><span class="lineno"> 443</span>  start--;</div> <div class="line"><a name="l00444"></a><span class="lineno"> 444</span> </div> <div class="line"><a name="l00445"></a><span class="lineno"> 445</span>  internal::tridiagonal_qr_step<MatrixType::Flags&RowMajorBit ? RowMajor : ColMajor>(diag.data(), m_subdiag.data(), start, end, computeEigenvectors ? m_eivec.data() : (<a class="code" href="classEigen_1_1SelfAdjointEigenSolver.html#a3f6fc00047c205ee590f676934aab28f">Scalar</a>*)0, n);</div> <div class="line"><a name="l00446"></a><span class="lineno"> 446</span>  }</div> <div class="line"><a name="l00447"></a><span class="lineno"> 447</span> </div> <div class="line"><a name="l00448"></a><span class="lineno"> 448</span>  <span class="keywordflow">if</span> (iter <= m_maxIterations * n)</div> <div class="line"><a name="l00449"></a><span class="lineno"> 449</span>  m_info = <a class="code" href="group__enums.html#gga51bc1ac16f26ebe51eae1abb77bd037bafdfbdf3247bd36a1f17270d5cec74c9c">Success</a>;</div> <div class="line"><a name="l00450"></a><span class="lineno"> 450</span>  <span class="keywordflow">else</span></div> <div class="line"><a name="l00451"></a><span class="lineno"> 451</span>  m_info = <a class="code" href="group__enums.html#gga51bc1ac16f26ebe51eae1abb77bd037ba4ff235bd185f3c5fceeec8d6540eb847">NoConvergence</a>;</div> <div class="line"><a name="l00452"></a><span class="lineno"> 452</span> </div> <div class="line"><a name="l00453"></a><span class="lineno"> 453</span>  <span class="comment">// Sort eigenvalues and corresponding vectors.</span></div> <div class="line"><a name="l00454"></a><span class="lineno"> 454</span>  <span class="comment">// TODO make the sort optional ?</span></div> <div class="line"><a name="l00455"></a><span class="lineno"> 455</span>  <span class="comment">// TODO use a better sort algorithm !!</span></div> <div class="line"><a name="l00456"></a><span class="lineno"> 456</span>  <span class="keywordflow">if</span> (m_info == <a class="code" href="group__enums.html#gga51bc1ac16f26ebe51eae1abb77bd037bafdfbdf3247bd36a1f17270d5cec74c9c">Success</a>)</div> <div class="line"><a name="l00457"></a><span class="lineno"> 457</span>  {</div> <div class="line"><a name="l00458"></a><span class="lineno"> 458</span>  <span class="keywordflow">for</span> (Index i = 0; i < n-1; ++i)</div> <div class="line"><a name="l00459"></a><span class="lineno"> 459</span>  {</div> <div class="line"><a name="l00460"></a><span class="lineno"> 460</span>  Index k;</div> <div class="line"><a name="l00461"></a><span class="lineno"> 461</span>  m_eivalues.segment(i,n-i).minCoeff(&k);</div> <div class="line"><a name="l00462"></a><span class="lineno"> 462</span>  <span class="keywordflow">if</span> (k > 0)</div> <div class="line"><a name="l00463"></a><span class="lineno"> 463</span>  {</div> <div class="line"><a name="l00464"></a><span class="lineno"> 464</span>  std::swap(m_eivalues[i], m_eivalues[k+i]);</div> <div class="line"><a name="l00465"></a><span class="lineno"> 465</span>  <span class="keywordflow">if</span>(computeEigenvectors)</div> <div class="line"><a name="l00466"></a><span class="lineno"> 466</span>  m_eivec.col(i).swap(m_eivec.col(k+i));</div> <div class="line"><a name="l00467"></a><span class="lineno"> 467</span>  }</div> <div class="line"><a name="l00468"></a><span class="lineno"> 468</span>  }</div> <div class="line"><a name="l00469"></a><span class="lineno"> 469</span>  }</div> <div class="line"><a name="l00470"></a><span class="lineno"> 470</span>  </div> <div class="line"><a name="l00471"></a><span class="lineno"> 471</span>  <span class="comment">// scale back the eigen values</span></div> <div class="line"><a name="l00472"></a><span class="lineno"> 472</span>  m_eivalues *= scale;</div> <div class="line"><a name="l00473"></a><span class="lineno"> 473</span> </div> <div class="line"><a name="l00474"></a><span class="lineno"> 474</span>  m_isInitialized = <span class="keyword">true</span>;</div> <div class="line"><a name="l00475"></a><span class="lineno"> 475</span>  m_eigenvectorsOk = computeEigenvectors;</div> <div class="line"><a name="l00476"></a><span class="lineno"> 476</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div> <div class="line"><a name="l00477"></a><span class="lineno"> 477</span> }</div> <div class="line"><a name="l00478"></a><span class="lineno"> 478</span> </div> <div class="line"><a name="l00479"></a><span class="lineno"> 479</span> </div> <div class="line"><a name="l00480"></a><span class="lineno"> 480</span> <span class="keyword">namespace </span>internal {</div> <div class="line"><a name="l00481"></a><span class="lineno"> 481</span>  </div> <div class="line"><a name="l00482"></a><span class="lineno"> 482</span> <span class="keyword">template</span><<span class="keyword">typename</span> SolverType,<span class="keywordtype">int</span> Size,<span class="keywordtype">bool</span> IsComplex> <span class="keyword">struct </span>direct_selfadjoint_eigenvalues</div> <div class="line"><a name="l00483"></a><span class="lineno"> 483</span> {</div> <div class="line"><a name="l00484"></a><span class="lineno"> 484</span>  <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> run(SolverType& eig, <span class="keyword">const</span> <span class="keyword">typename</span> SolverType::MatrixType& A, <span class="keywordtype">int</span> options)</div> <div class="line"><a name="l00485"></a><span class="lineno"> 485</span>  { eig.compute(A,options); }</div> <div class="line"><a name="l00486"></a><span class="lineno"> 486</span> };</div> <div class="line"><a name="l00487"></a><span class="lineno"> 487</span> </div> <div class="line"><a name="l00488"></a><span class="lineno"> 488</span> <span class="keyword">template</span><<span class="keyword">typename</span> SolverType> <span class="keyword">struct </span>direct_selfadjoint_eigenvalues<SolverType,3,false></div> <div class="line"><a name="l00489"></a><span class="lineno"> 489</span> {</div> <div class="line"><a name="l00490"></a><span class="lineno"> 490</span>  <span class="keyword">typedef</span> <span class="keyword">typename</span> SolverType::MatrixType MatrixType;</div> <div class="line"><a name="l00491"></a><span class="lineno"> 491</span>  <span class="keyword">typedef</span> <span class="keyword">typename</span> SolverType::RealVectorType VectorType;</div> <div class="line"><a name="l00492"></a><span class="lineno"> 492</span>  <span class="keyword">typedef</span> <span class="keyword">typename</span> SolverType::Scalar Scalar;</div> <div class="line"><a name="l00493"></a><span class="lineno"> 493</span>  </div> <div class="line"><a name="l00494"></a><span class="lineno"> 494</span>  <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> computeRoots(<span class="keyword">const</span> MatrixType& m, VectorType& roots)</div> <div class="line"><a name="l00495"></a><span class="lineno"> 495</span>  {</div> <div class="line"><a name="l00496"></a><span class="lineno"> 496</span>  <span class="keyword">using</span> std::sqrt;</div> <div class="line"><a name="l00497"></a><span class="lineno"> 497</span>  <span class="keyword">using</span> std::atan2;</div> <div class="line"><a name="l00498"></a><span class="lineno"> 498</span>  <span class="keyword">using</span> std::cos;</div> <div class="line"><a name="l00499"></a><span class="lineno"> 499</span>  <span class="keyword">using</span> std::sin;</div> <div class="line"><a name="l00500"></a><span class="lineno"> 500</span>  <span class="keyword">const</span> Scalar s_inv3 = Scalar(1.0)/Scalar(3.0);</div> <div class="line"><a name="l00501"></a><span class="lineno"> 501</span>  <span class="keyword">const</span> Scalar s_sqrt3 = sqrt(Scalar(3.0));</div> <div class="line"><a name="l00502"></a><span class="lineno"> 502</span> </div> <div class="line"><a name="l00503"></a><span class="lineno"> 503</span>  <span class="comment">// The characteristic equation is x^3 - c2*x^2 + c1*x - c0 = 0. The</span></div> <div class="line"><a name="l00504"></a><span class="lineno"> 504</span>  <span class="comment">// eigenvalues are the roots to this equation, all guaranteed to be</span></div> <div class="line"><a name="l00505"></a><span class="lineno"> 505</span>  <span class="comment">// real-valued, because the matrix is symmetric.</span></div> <div class="line"><a name="l00506"></a><span class="lineno"> 506</span>  Scalar c0 = m(0,0)*m(1,1)*m(2,2) + Scalar(2)*m(1,0)*m(2,0)*m(2,1) - m(0,0)*m(2,1)*m(2,1) - m(1,1)*m(2,0)*m(2,0) - m(2,2)*m(1,0)*m(1,0);</div> <div class="line"><a name="l00507"></a><span class="lineno"> 507</span>  Scalar c1 = m(0,0)*m(1,1) - m(1,0)*m(1,0) + m(0,0)*m(2,2) - m(2,0)*m(2,0) + m(1,1)*m(2,2) - m(2,1)*m(2,1);</div> <div class="line"><a name="l00508"></a><span class="lineno"> 508</span>  Scalar c2 = m(0,0) + m(1,1) + m(2,2);</div> <div class="line"><a name="l00509"></a><span class="lineno"> 509</span> </div> <div class="line"><a name="l00510"></a><span class="lineno"> 510</span>  <span class="comment">// Construct the parameters used in classifying the roots of the equation</span></div> <div class="line"><a name="l00511"></a><span class="lineno"> 511</span>  <span class="comment">// and in solving the equation for the roots in closed form.</span></div> <div class="line"><a name="l00512"></a><span class="lineno"> 512</span>  Scalar c2_over_3 = c2*s_inv3;</div> <div class="line"><a name="l00513"></a><span class="lineno"> 513</span>  Scalar a_over_3 = (c1 - c2*c2_over_3)*s_inv3;</div> <div class="line"><a name="l00514"></a><span class="lineno"> 514</span>  <span class="keywordflow">if</span> (a_over_3 > Scalar(0))</div> <div class="line"><a name="l00515"></a><span class="lineno"> 515</span>  a_over_3 = Scalar(0);</div> <div class="line"><a name="l00516"></a><span class="lineno"> 516</span> </div> <div class="line"><a name="l00517"></a><span class="lineno"> 517</span>  Scalar half_b = Scalar(0.5)*(c0 + c2_over_3*(Scalar(2)*c2_over_3*c2_over_3 - c1));</div> <div class="line"><a name="l00518"></a><span class="lineno"> 518</span> </div> <div class="line"><a name="l00519"></a><span class="lineno"> 519</span>  Scalar q = half_b*half_b + a_over_3*a_over_3*a_over_3;</div> <div class="line"><a name="l00520"></a><span class="lineno"> 520</span>  <span class="keywordflow">if</span> (q > Scalar(0))</div> <div class="line"><a name="l00521"></a><span class="lineno"> 521</span>  q = Scalar(0);</div> <div class="line"><a name="l00522"></a><span class="lineno"> 522</span> </div> <div class="line"><a name="l00523"></a><span class="lineno"> 523</span>  <span class="comment">// Compute the eigenvalues by solving for the roots of the polynomial.</span></div> <div class="line"><a name="l00524"></a><span class="lineno"> 524</span>  Scalar rho = sqrt(-a_over_3);</div> <div class="line"><a name="l00525"></a><span class="lineno"> 525</span>  Scalar theta = atan2(sqrt(-q),half_b)*s_inv3;</div> <div class="line"><a name="l00526"></a><span class="lineno"> 526</span>  Scalar cos_theta = cos(theta);</div> <div class="line"><a name="l00527"></a><span class="lineno"> 527</span>  Scalar sin_theta = sin(theta);</div> <div class="line"><a name="l00528"></a><span class="lineno"> 528</span>  roots(0) = c2_over_3 + Scalar(2)*rho*cos_theta;</div> <div class="line"><a name="l00529"></a><span class="lineno"> 529</span>  roots(1) = c2_over_3 - rho*(cos_theta + s_sqrt3*sin_theta);</div> <div class="line"><a name="l00530"></a><span class="lineno"> 530</span>  roots(2) = c2_over_3 - rho*(cos_theta - s_sqrt3*sin_theta);</div> <div class="line"><a name="l00531"></a><span class="lineno"> 531</span> </div> <div class="line"><a name="l00532"></a><span class="lineno"> 532</span>  <span class="comment">// Sort in increasing order.</span></div> <div class="line"><a name="l00533"></a><span class="lineno"> 533</span>  <span class="keywordflow">if</span> (roots(0) >= roots(1))</div> <div class="line"><a name="l00534"></a><span class="lineno"> 534</span>  std::swap(roots(0),roots(1));</div> <div class="line"><a name="l00535"></a><span class="lineno"> 535</span>  <span class="keywordflow">if</span> (roots(1) >= roots(2))</div> <div class="line"><a name="l00536"></a><span class="lineno"> 536</span>  {</div> <div class="line"><a name="l00537"></a><span class="lineno"> 537</span>  std::swap(roots(1),roots(2));</div> <div class="line"><a name="l00538"></a><span class="lineno"> 538</span>  <span class="keywordflow">if</span> (roots(0) >= roots(1))</div> <div class="line"><a name="l00539"></a><span class="lineno"> 539</span>  std::swap(roots(0),roots(1));</div> <div class="line"><a name="l00540"></a><span class="lineno"> 540</span>  }</div> <div class="line"><a name="l00541"></a><span class="lineno"> 541</span>  }</div> <div class="line"><a name="l00542"></a><span class="lineno"> 542</span>  </div> <div class="line"><a name="l00543"></a><span class="lineno"> 543</span>  <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> run(SolverType& solver, <span class="keyword">const</span> MatrixType& mat, <span class="keywordtype">int</span> options)</div> <div class="line"><a name="l00544"></a><span class="lineno"> 544</span>  {</div> <div class="line"><a name="l00545"></a><span class="lineno"> 545</span>  <span class="keyword">using</span> std::sqrt;</div> <div class="line"><a name="l00546"></a><span class="lineno"> 546</span>  eigen_assert(mat.cols() == 3 && mat.cols() == mat.rows());</div> <div class="line"><a name="l00547"></a><span class="lineno"> 547</span>  eigen_assert((options&~(EigVecMask|GenEigMask))==0</div> <div class="line"><a name="l00548"></a><span class="lineno"> 548</span>  && (options&EigVecMask)!=EigVecMask</div> <div class="line"><a name="l00549"></a><span class="lineno"> 549</span>  && <span class="stringliteral">"invalid option parameter"</span>);</div> <div class="line"><a name="l00550"></a><span class="lineno"> 550</span>  <span class="keywordtype">bool</span> computeEigenvectors = (options&<a class="code" href="group__enums.html#gga2d78499b99ddc29b9494f7ea33864d52a92a556ff1203acee3bacb02b0d157870">ComputeEigenvectors</a>)==<a class="code" href="group__enums.html#gga2d78499b99ddc29b9494f7ea33864d52a92a556ff1203acee3bacb02b0d157870">ComputeEigenvectors</a>;</div> <div class="line"><a name="l00551"></a><span class="lineno"> 551</span>  </div> <div class="line"><a name="l00552"></a><span class="lineno"> 552</span>  MatrixType& eivecs = solver.m_eivec;</div> <div class="line"><a name="l00553"></a><span class="lineno"> 553</span>  VectorType& eivals = solver.m_eivalues;</div> <div class="line"><a name="l00554"></a><span class="lineno"> 554</span>  </div> <div class="line"><a name="l00555"></a><span class="lineno"> 555</span>  <span class="comment">// map the matrix coefficients to [-1:1] to avoid over- and underflow.</span></div> <div class="line"><a name="l00556"></a><span class="lineno"> 556</span>  Scalar scale = mat.cwiseAbs().maxCoeff();</div> <div class="line"><a name="l00557"></a><span class="lineno"> 557</span>  MatrixType scaledMat = mat / scale;</div> <div class="line"><a name="l00558"></a><span class="lineno"> 558</span> </div> <div class="line"><a name="l00559"></a><span class="lineno"> 559</span>  <span class="comment">// compute the eigenvalues</span></div> <div class="line"><a name="l00560"></a><span class="lineno"> 560</span>  computeRoots(scaledMat,eivals);</div> <div class="line"><a name="l00561"></a><span class="lineno"> 561</span> </div> <div class="line"><a name="l00562"></a><span class="lineno"> 562</span>  <span class="comment">// compute the eigen vectors</span></div> <div class="line"><a name="l00563"></a><span class="lineno"> 563</span>  <span class="keywordflow">if</span>(computeEigenvectors)</div> <div class="line"><a name="l00564"></a><span class="lineno"> 564</span>  {</div> <div class="line"><a name="l00565"></a><span class="lineno"> 565</span>  Scalar safeNorm2 = <a class="code" href="structEigen_1_1NumTraits.html">Eigen::NumTraits<Scalar>::epsilon</a>();</div> <div class="line"><a name="l00566"></a><span class="lineno"> 566</span>  safeNorm2 *= safeNorm2;</div> <div class="line"><a name="l00567"></a><span class="lineno"> 567</span>  <span class="keywordflow">if</span>((eivals(2)-eivals(0))<=<a class="code" href="structEigen_1_1NumTraits.html">Eigen::NumTraits<Scalar>::epsilon</a>())</div> <div class="line"><a name="l00568"></a><span class="lineno"> 568</span>  {</div> <div class="line"><a name="l00569"></a><span class="lineno"> 569</span>  eivecs.setIdentity();</div> <div class="line"><a name="l00570"></a><span class="lineno"> 570</span>  }</div> <div class="line"><a name="l00571"></a><span class="lineno"> 571</span>  <span class="keywordflow">else</span></div> <div class="line"><a name="l00572"></a><span class="lineno"> 572</span>  {</div> <div class="line"><a name="l00573"></a><span class="lineno"> 573</span>  scaledMat = scaledMat.template selfadjointView<Lower>();</div> <div class="line"><a name="l00574"></a><span class="lineno"> 574</span>  MatrixType tmp;</div> <div class="line"><a name="l00575"></a><span class="lineno"> 575</span>  tmp = scaledMat;</div> <div class="line"><a name="l00576"></a><span class="lineno"> 576</span> </div> <div class="line"><a name="l00577"></a><span class="lineno"> 577</span>  Scalar d0 = eivals(2) - eivals(1);</div> <div class="line"><a name="l00578"></a><span class="lineno"> 578</span>  Scalar d1 = eivals(1) - eivals(0);</div> <div class="line"><a name="l00579"></a><span class="lineno"> 579</span>  <span class="keywordtype">int</span> k = d0 > d1 ? 2 : 0;</div> <div class="line"><a name="l00580"></a><span class="lineno"> 580</span>  d0 = d0 > d1 ? d1 : d0;</div> <div class="line"><a name="l00581"></a><span class="lineno"> 581</span> </div> <div class="line"><a name="l00582"></a><span class="lineno"> 582</span>  tmp.diagonal().array () -= eivals(k);</div> <div class="line"><a name="l00583"></a><span class="lineno"> 583</span>  VectorType cross;</div> <div class="line"><a name="l00584"></a><span class="lineno"> 584</span>  Scalar n;</div> <div class="line"><a name="l00585"></a><span class="lineno"> 585</span>  n = (cross = tmp.row(0).cross(tmp.row(1))).squaredNorm();</div> <div class="line"><a name="l00586"></a><span class="lineno"> 586</span> </div> <div class="line"><a name="l00587"></a><span class="lineno"> 587</span>  <span class="keywordflow">if</span>(n>safeNorm2)</div> <div class="line"><a name="l00588"></a><span class="lineno"> 588</span>  eivecs.col(k) = cross / sqrt(n);</div> <div class="line"><a name="l00589"></a><span class="lineno"> 589</span>  <span class="keywordflow">else</span></div> <div class="line"><a name="l00590"></a><span class="lineno"> 590</span>  {</div> <div class="line"><a name="l00591"></a><span class="lineno"> 591</span>  n = (cross = tmp.row(0).cross(tmp.row(2))).squaredNorm();</div> <div class="line"><a name="l00592"></a><span class="lineno"> 592</span> </div> <div class="line"><a name="l00593"></a><span class="lineno"> 593</span>  <span class="keywordflow">if</span>(n>safeNorm2)</div> <div class="line"><a name="l00594"></a><span class="lineno"> 594</span>  eivecs.col(k) = cross / sqrt(n);</div> <div class="line"><a name="l00595"></a><span class="lineno"> 595</span>  <span class="keywordflow">else</span></div> <div class="line"><a name="l00596"></a><span class="lineno"> 596</span>  {</div> <div class="line"><a name="l00597"></a><span class="lineno"> 597</span>  n = (cross = tmp.row(1).cross(tmp.row(2))).squaredNorm();</div> <div class="line"><a name="l00598"></a><span class="lineno"> 598</span> </div> <div class="line"><a name="l00599"></a><span class="lineno"> 599</span>  <span class="keywordflow">if</span>(n>safeNorm2)</div> <div class="line"><a name="l00600"></a><span class="lineno"> 600</span>  eivecs.col(k) = cross / sqrt(n);</div> <div class="line"><a name="l00601"></a><span class="lineno"> 601</span>  <span class="keywordflow">else</span></div> <div class="line"><a name="l00602"></a><span class="lineno"> 602</span>  {</div> <div class="line"><a name="l00603"></a><span class="lineno"> 603</span>  <span class="comment">// the input matrix and/or the eigenvaues probably contains some inf/NaN,</span></div> <div class="line"><a name="l00604"></a><span class="lineno"> 604</span>  <span class="comment">// => exit</span></div> <div class="line"><a name="l00605"></a><span class="lineno"> 605</span>  <span class="comment">// scale back to the original size.</span></div> <div class="line"><a name="l00606"></a><span class="lineno"> 606</span>  eivals *= scale;</div> <div class="line"><a name="l00607"></a><span class="lineno"> 607</span> </div> <div class="line"><a name="l00608"></a><span class="lineno"> 608</span>  solver.m_info = <a class="code" href="group__enums.html#gga51bc1ac16f26ebe51eae1abb77bd037ba710fff14e8fc77846d4b75d8f4cc2d5c">NumericalIssue</a>;</div> <div class="line"><a name="l00609"></a><span class="lineno"> 609</span>  solver.m_isInitialized = <span class="keyword">true</span>;</div> <div class="line"><a name="l00610"></a><span class="lineno"> 610</span>  solver.m_eigenvectorsOk = computeEigenvectors;</div> <div class="line"><a name="l00611"></a><span class="lineno"> 611</span>  <span class="keywordflow">return</span>;</div> <div class="line"><a name="l00612"></a><span class="lineno"> 612</span>  }</div> <div class="line"><a name="l00613"></a><span class="lineno"> 613</span>  }</div> <div class="line"><a name="l00614"></a><span class="lineno"> 614</span>  }</div> <div class="line"><a name="l00615"></a><span class="lineno"> 615</span> </div> <div class="line"><a name="l00616"></a><span class="lineno"> 616</span>  tmp = scaledMat;</div> <div class="line"><a name="l00617"></a><span class="lineno"> 617</span>  tmp.diagonal().array() -= eivals(1);</div> <div class="line"><a name="l00618"></a><span class="lineno"> 618</span> </div> <div class="line"><a name="l00619"></a><span class="lineno"> 619</span>  <span class="keywordflow">if</span>(d0<=<a class="code" href="structEigen_1_1NumTraits.html">Eigen::NumTraits<Scalar>::epsilon</a>())</div> <div class="line"><a name="l00620"></a><span class="lineno"> 620</span>  eivecs.col(1) = eivecs.col(k).unitOrthogonal();</div> <div class="line"><a name="l00621"></a><span class="lineno"> 621</span>  <span class="keywordflow">else</span></div> <div class="line"><a name="l00622"></a><span class="lineno"> 622</span>  {</div> <div class="line"><a name="l00623"></a><span class="lineno"> 623</span>  n = (cross = eivecs.col(k).cross(tmp.row(0).normalized())).squaredNorm();</div> <div class="line"><a name="l00624"></a><span class="lineno"> 624</span>  <span class="keywordflow">if</span>(n>safeNorm2)</div> <div class="line"><a name="l00625"></a><span class="lineno"> 625</span>  eivecs.col(1) = cross / sqrt(n);</div> <div class="line"><a name="l00626"></a><span class="lineno"> 626</span>  <span class="keywordflow">else</span></div> <div class="line"><a name="l00627"></a><span class="lineno"> 627</span>  {</div> <div class="line"><a name="l00628"></a><span class="lineno"> 628</span>  n = (cross = eivecs.col(k).cross(tmp.row(1))).squaredNorm();</div> <div class="line"><a name="l00629"></a><span class="lineno"> 629</span>  <span class="keywordflow">if</span>(n>safeNorm2)</div> <div class="line"><a name="l00630"></a><span class="lineno"> 630</span>  eivecs.col(1) = cross / sqrt(n);</div> <div class="line"><a name="l00631"></a><span class="lineno"> 631</span>  <span class="keywordflow">else</span></div> <div class="line"><a name="l00632"></a><span class="lineno"> 632</span>  {</div> <div class="line"><a name="l00633"></a><span class="lineno"> 633</span>  n = (cross = eivecs.col(k).cross(tmp.row(2))).squaredNorm();</div> <div class="line"><a name="l00634"></a><span class="lineno"> 634</span>  <span class="keywordflow">if</span>(n>safeNorm2)</div> <div class="line"><a name="l00635"></a><span class="lineno"> 635</span>  eivecs.col(1) = cross / sqrt(n);</div> <div class="line"><a name="l00636"></a><span class="lineno"> 636</span>  <span class="keywordflow">else</span></div> <div class="line"><a name="l00637"></a><span class="lineno"> 637</span>  {</div> <div class="line"><a name="l00638"></a><span class="lineno"> 638</span>  <span class="comment">// we should never reach this point,</span></div> <div class="line"><a name="l00639"></a><span class="lineno"> 639</span>  <span class="comment">// if so the last two eigenvalues are likely to ve very closed to each other</span></div> <div class="line"><a name="l00640"></a><span class="lineno"> 640</span>  eivecs.col(1) = eivecs.col(k).unitOrthogonal();</div> <div class="line"><a name="l00641"></a><span class="lineno"> 641</span>  }</div> <div class="line"><a name="l00642"></a><span class="lineno"> 642</span>  }</div> <div class="line"><a name="l00643"></a><span class="lineno"> 643</span>  }</div> <div class="line"><a name="l00644"></a><span class="lineno"> 644</span> </div> <div class="line"><a name="l00645"></a><span class="lineno"> 645</span>  <span class="comment">// make sure that eivecs[1] is orthogonal to eivecs[2]</span></div> <div class="line"><a name="l00646"></a><span class="lineno"> 646</span>  Scalar d = eivecs.col(1).dot(eivecs.col(k));</div> <div class="line"><a name="l00647"></a><span class="lineno"> 647</span>  eivecs.col(1) = (eivecs.col(1) - d * eivecs.col(k)).normalized();</div> <div class="line"><a name="l00648"></a><span class="lineno"> 648</span>  }</div> <div class="line"><a name="l00649"></a><span class="lineno"> 649</span> </div> <div class="line"><a name="l00650"></a><span class="lineno"> 650</span>  eivecs.col(k==2 ? 0 : 2) = eivecs.col(k).cross(eivecs.col(1)).normalized();</div> <div class="line"><a name="l00651"></a><span class="lineno"> 651</span>  }</div> <div class="line"><a name="l00652"></a><span class="lineno"> 652</span>  }</div> <div class="line"><a name="l00653"></a><span class="lineno"> 653</span>  <span class="comment">// Rescale back to the original size.</span></div> <div class="line"><a name="l00654"></a><span class="lineno"> 654</span>  eivals *= scale;</div> <div class="line"><a name="l00655"></a><span class="lineno"> 655</span>  </div> <div class="line"><a name="l00656"></a><span class="lineno"> 656</span>  solver.m_info = <a class="code" href="group__enums.html#gga51bc1ac16f26ebe51eae1abb77bd037bafdfbdf3247bd36a1f17270d5cec74c9c">Success</a>;</div> <div class="line"><a name="l00657"></a><span class="lineno"> 657</span>  solver.m_isInitialized = <span class="keyword">true</span>;</div> <div class="line"><a name="l00658"></a><span class="lineno"> 658</span>  solver.m_eigenvectorsOk = computeEigenvectors;</div> <div class="line"><a name="l00659"></a><span class="lineno"> 659</span>  }</div> <div class="line"><a name="l00660"></a><span class="lineno"> 660</span> };</div> <div class="line"><a name="l00661"></a><span class="lineno"> 661</span> </div> <div class="line"><a name="l00662"></a><span class="lineno"> 662</span> <span class="comment">// 2x2 direct eigenvalues decomposition, code from Hauke Heibel</span></div> <div class="line"><a name="l00663"></a><span class="lineno"> 663</span> <span class="keyword">template</span><<span class="keyword">typename</span> SolverType> <span class="keyword">struct </span>direct_selfadjoint_eigenvalues<SolverType,2,false></div> <div class="line"><a name="l00664"></a><span class="lineno"> 664</span> {</div> <div class="line"><a name="l00665"></a><span class="lineno"> 665</span>  <span class="keyword">typedef</span> <span class="keyword">typename</span> SolverType::MatrixType MatrixType;</div> <div class="line"><a name="l00666"></a><span class="lineno"> 666</span>  <span class="keyword">typedef</span> <span class="keyword">typename</span> SolverType::RealVectorType VectorType;</div> <div class="line"><a name="l00667"></a><span class="lineno"> 667</span>  <span class="keyword">typedef</span> <span class="keyword">typename</span> SolverType::Scalar Scalar;</div> <div class="line"><a name="l00668"></a><span class="lineno"> 668</span>  </div> <div class="line"><a name="l00669"></a><span class="lineno"> 669</span>  <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> computeRoots(<span class="keyword">const</span> MatrixType& m, VectorType& roots)</div> <div class="line"><a name="l00670"></a><span class="lineno"> 670</span>  {</div> <div class="line"><a name="l00671"></a><span class="lineno"> 671</span>  <span class="keyword">using</span> std::sqrt;</div> <div class="line"><a name="l00672"></a><span class="lineno"> 672</span>  <span class="keyword">const</span> Scalar t0 = Scalar(0.5) * sqrt( numext::abs2(m(0,0)-m(1,1)) + Scalar(4)*m(1,0)*m(1,0));</div> <div class="line"><a name="l00673"></a><span class="lineno"> 673</span>  <span class="keyword">const</span> Scalar t1 = Scalar(0.5) * (m(0,0) + m(1,1));</div> <div class="line"><a name="l00674"></a><span class="lineno"> 674</span>  roots(0) = t1 - t0;</div> <div class="line"><a name="l00675"></a><span class="lineno"> 675</span>  roots(1) = t1 + t0;</div> <div class="line"><a name="l00676"></a><span class="lineno"> 676</span>  }</div> <div class="line"><a name="l00677"></a><span class="lineno"> 677</span>  </div> <div class="line"><a name="l00678"></a><span class="lineno"> 678</span>  <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> run(SolverType& solver, <span class="keyword">const</span> MatrixType& mat, <span class="keywordtype">int</span> options)</div> <div class="line"><a name="l00679"></a><span class="lineno"> 679</span>  {</div> <div class="line"><a name="l00680"></a><span class="lineno"> 680</span>  <span class="keyword">using</span> std::sqrt;</div> <div class="line"><a name="l00681"></a><span class="lineno"> 681</span>  eigen_assert(mat.cols() == 2 && mat.cols() == mat.rows());</div> <div class="line"><a name="l00682"></a><span class="lineno"> 682</span>  eigen_assert((options&~(EigVecMask|GenEigMask))==0</div> <div class="line"><a name="l00683"></a><span class="lineno"> 683</span>  && (options&EigVecMask)!=EigVecMask</div> <div class="line"><a name="l00684"></a><span class="lineno"> 684</span>  && <span class="stringliteral">"invalid option parameter"</span>);</div> <div class="line"><a name="l00685"></a><span class="lineno"> 685</span>  <span class="keywordtype">bool</span> computeEigenvectors = (options&<a class="code" href="group__enums.html#gga2d78499b99ddc29b9494f7ea33864d52a92a556ff1203acee3bacb02b0d157870">ComputeEigenvectors</a>)==<a class="code" href="group__enums.html#gga2d78499b99ddc29b9494f7ea33864d52a92a556ff1203acee3bacb02b0d157870">ComputeEigenvectors</a>;</div> <div class="line"><a name="l00686"></a><span class="lineno"> 686</span>  </div> <div class="line"><a name="l00687"></a><span class="lineno"> 687</span>  MatrixType& eivecs = solver.m_eivec;</div> <div class="line"><a name="l00688"></a><span class="lineno"> 688</span>  VectorType& eivals = solver.m_eivalues;</div> <div class="line"><a name="l00689"></a><span class="lineno"> 689</span>  </div> <div class="line"><a name="l00690"></a><span class="lineno"> 690</span>  <span class="comment">// map the matrix coefficients to [-1:1] to avoid over- and underflow.</span></div> <div class="line"><a name="l00691"></a><span class="lineno"> 691</span>  Scalar scale = mat.cwiseAbs().maxCoeff();</div> <div class="line"><a name="l00692"></a><span class="lineno"> 692</span>  scale = (std::max)(scale,Scalar(1));</div> <div class="line"><a name="l00693"></a><span class="lineno"> 693</span>  MatrixType scaledMat = mat / scale;</div> <div class="line"><a name="l00694"></a><span class="lineno"> 694</span>  </div> <div class="line"><a name="l00695"></a><span class="lineno"> 695</span>  <span class="comment">// Compute the eigenvalues</span></div> <div class="line"><a name="l00696"></a><span class="lineno"> 696</span>  computeRoots(scaledMat,eivals);</div> <div class="line"><a name="l00697"></a><span class="lineno"> 697</span>  </div> <div class="line"><a name="l00698"></a><span class="lineno"> 698</span>  <span class="comment">// compute the eigen vectors</span></div> <div class="line"><a name="l00699"></a><span class="lineno"> 699</span>  <span class="keywordflow">if</span>(computeEigenvectors)</div> <div class="line"><a name="l00700"></a><span class="lineno"> 700</span>  {</div> <div class="line"><a name="l00701"></a><span class="lineno"> 701</span>  scaledMat.diagonal().array () -= eivals(1);</div> <div class="line"><a name="l00702"></a><span class="lineno"> 702</span>  Scalar a2 = numext::abs2(scaledMat(0,0));</div> <div class="line"><a name="l00703"></a><span class="lineno"> 703</span>  Scalar c2 = numext::abs2(scaledMat(1,1));</div> <div class="line"><a name="l00704"></a><span class="lineno"> 704</span>  Scalar b2 = numext::abs2(scaledMat(1,0));</div> <div class="line"><a name="l00705"></a><span class="lineno"> 705</span>  <span class="keywordflow">if</span>(a2>c2)</div> <div class="line"><a name="l00706"></a><span class="lineno"> 706</span>  {</div> <div class="line"><a name="l00707"></a><span class="lineno"> 707</span>  eivecs.col(1) << -scaledMat(1,0), scaledMat(0,0);</div> <div class="line"><a name="l00708"></a><span class="lineno"> 708</span>  eivecs.col(1) /= sqrt(a2+b2);</div> <div class="line"><a name="l00709"></a><span class="lineno"> 709</span>  }</div> <div class="line"><a name="l00710"></a><span class="lineno"> 710</span>  <span class="keywordflow">else</span></div> <div class="line"><a name="l00711"></a><span class="lineno"> 711</span>  {</div> <div class="line"><a name="l00712"></a><span class="lineno"> 712</span>  eivecs.col(1) << -scaledMat(1,1), scaledMat(1,0);</div> <div class="line"><a name="l00713"></a><span class="lineno"> 713</span>  eivecs.col(1) /= sqrt(c2+b2);</div> <div class="line"><a name="l00714"></a><span class="lineno"> 714</span>  }</div> <div class="line"><a name="l00715"></a><span class="lineno"> 715</span> </div> <div class="line"><a name="l00716"></a><span class="lineno"> 716</span>  eivecs.col(0) << eivecs.col(1).unitOrthogonal();</div> <div class="line"><a name="l00717"></a><span class="lineno"> 717</span>  }</div> <div class="line"><a name="l00718"></a><span class="lineno"> 718</span>  </div> <div class="line"><a name="l00719"></a><span class="lineno"> 719</span>  <span class="comment">// Rescale back to the original size.</span></div> <div class="line"><a name="l00720"></a><span class="lineno"> 720</span>  eivals *= scale;</div> <div class="line"><a name="l00721"></a><span class="lineno"> 721</span>  </div> <div class="line"><a name="l00722"></a><span class="lineno"> 722</span>  solver.m_info = <a class="code" href="group__enums.html#gga51bc1ac16f26ebe51eae1abb77bd037bafdfbdf3247bd36a1f17270d5cec74c9c">Success</a>;</div> <div class="line"><a name="l00723"></a><span class="lineno"> 723</span>  solver.m_isInitialized = <span class="keyword">true</span>;</div> <div class="line"><a name="l00724"></a><span class="lineno"> 724</span>  solver.m_eigenvectorsOk = computeEigenvectors;</div> <div class="line"><a name="l00725"></a><span class="lineno"> 725</span>  }</div> <div class="line"><a name="l00726"></a><span class="lineno"> 726</span> };</div> <div class="line"><a name="l00727"></a><span class="lineno"> 727</span> </div> <div class="line"><a name="l00728"></a><span class="lineno"> 728</span> }</div> <div class="line"><a name="l00729"></a><span class="lineno"> 729</span> </div> <div class="line"><a name="l00730"></a><span class="lineno"> 730</span> <span class="keyword">template</span><<span class="keyword">typename</span> MatrixType></div> <div class="line"><a name="l00731"></a><span class="lineno"> 731</span> SelfAdjointEigenSolver<MatrixType>& <a class="code" href="classEigen_1_1SelfAdjointEigenSolver.html#a85cda7e77edf4923f3fc0512c83f6323">SelfAdjointEigenSolver<MatrixType></a></div> <div class="line"><a name="l00732"></a><span class="lineno"><a class="line" href="classEigen_1_1SelfAdjointEigenSolver.html#a85cda7e77edf4923f3fc0512c83f6323"> 732</a></span> <a class="code" href="classEigen_1_1SelfAdjointEigenSolver.html#a85cda7e77edf4923f3fc0512c83f6323">::computeDirect</a>(<span class="keyword">const</span> MatrixType& matrix, <span class="keywordtype">int</span> options)</div> <div class="line"><a name="l00733"></a><span class="lineno"> 733</span> {</div> <div class="line"><a name="l00734"></a><span class="lineno"> 734</span>  internal::direct_selfadjoint_eigenvalues<SelfAdjointEigenSolver,Size,NumTraits<Scalar>::IsComplex>::run(*<span class="keyword">this</span>,matrix,options);</div> <div class="line"><a name="l00735"></a><span class="lineno"> 735</span>  <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div> <div class="line"><a name="l00736"></a><span class="lineno"> 736</span> }</div> <div class="line"><a name="l00737"></a><span class="lineno"> 737</span> </div> <div class="line"><a name="l00738"></a><span class="lineno"> 738</span> <span class="keyword">namespace </span>internal {</div> <div class="line"><a name="l00739"></a><span class="lineno"> 739</span> <span class="keyword">template</span><<span class="keywordtype">int</span> StorageOrder,<span class="keyword">typename</span> RealScalar, <span class="keyword">typename</span> Scalar, <span class="keyword">typename</span> Index></div> <div class="line"><a name="l00740"></a><span class="lineno"> 740</span> <span class="keyword">static</span> <span class="keywordtype">void</span> tridiagonal_qr_step(RealScalar* diag, RealScalar* subdiag, Index start, Index end, Scalar* matrixQ, Index n)</div> <div class="line"><a name="l00741"></a><span class="lineno"> 741</span> {</div> <div class="line"><a name="l00742"></a><span class="lineno"> 742</span>  <span class="keyword">using</span> std::abs;</div> <div class="line"><a name="l00743"></a><span class="lineno"> 743</span>  RealScalar td = (diag[end-1] - diag[end])*RealScalar(0.5);</div> <div class="line"><a name="l00744"></a><span class="lineno"> 744</span>  RealScalar e = subdiag[end-1];</div> <div class="line"><a name="l00745"></a><span class="lineno"> 745</span>  <span class="comment">// Note that thanks to scaling, e^2 or td^2 cannot overflow, however they can still</span></div> <div class="line"><a name="l00746"></a><span class="lineno"> 746</span>  <span class="comment">// underflow thus leading to inf/NaN values when using the following commented code:</span></div> <div class="line"><a name="l00747"></a><span class="lineno"> 747</span> <span class="comment">// RealScalar e2 = numext::abs2(subdiag[end-1]);</span></div> <div class="line"><a name="l00748"></a><span class="lineno"> 748</span> <span class="comment">// RealScalar mu = diag[end] - e2 / (td + (td>0 ? 1 : -1) * sqrt(td*td + e2));</span></div> <div class="line"><a name="l00749"></a><span class="lineno"> 749</span>  <span class="comment">// This explain the following, somewhat more complicated, version:</span></div> <div class="line"><a name="l00750"></a><span class="lineno"> 750</span>  RealScalar mu = diag[end];</div> <div class="line"><a name="l00751"></a><span class="lineno"> 751</span>  <span class="keywordflow">if</span>(td==0)</div> <div class="line"><a name="l00752"></a><span class="lineno"> 752</span>  mu -= abs(e);</div> <div class="line"><a name="l00753"></a><span class="lineno"> 753</span>  <span class="keywordflow">else</span></div> <div class="line"><a name="l00754"></a><span class="lineno"> 754</span>  {</div> <div class="line"><a name="l00755"></a><span class="lineno"> 755</span>  RealScalar e2 = numext::abs2(subdiag[end-1]);</div> <div class="line"><a name="l00756"></a><span class="lineno"> 756</span>  RealScalar h = numext::hypot(td,e);</div> <div class="line"><a name="l00757"></a><span class="lineno"> 757</span>  <span class="keywordflow">if</span>(e2==0) mu -= (e / (td + (td>0 ? 1 : -1))) * (e / h);</div> <div class="line"><a name="l00758"></a><span class="lineno"> 758</span>  <span class="keywordflow">else</span> mu -= e2 / (td + (td>0 ? h : -h));</div> <div class="line"><a name="l00759"></a><span class="lineno"> 759</span>  }</div> <div class="line"><a name="l00760"></a><span class="lineno"> 760</span>  </div> <div class="line"><a name="l00761"></a><span class="lineno"> 761</span>  RealScalar x = diag[start] - mu;</div> <div class="line"><a name="l00762"></a><span class="lineno"> 762</span>  RealScalar z = subdiag[start];</div> <div class="line"><a name="l00763"></a><span class="lineno"> 763</span>  <span class="keywordflow">for</span> (Index k = start; k < end; ++k)</div> <div class="line"><a name="l00764"></a><span class="lineno"> 764</span>  {</div> <div class="line"><a name="l00765"></a><span class="lineno"> 765</span>  JacobiRotation<RealScalar> rot;</div> <div class="line"><a name="l00766"></a><span class="lineno"> 766</span>  rot.makeGivens(x, z);</div> <div class="line"><a name="l00767"></a><span class="lineno"> 767</span> </div> <div class="line"><a name="l00768"></a><span class="lineno"> 768</span>  <span class="comment">// do T = G' T G</span></div> <div class="line"><a name="l00769"></a><span class="lineno"> 769</span>  RealScalar sdk = rot.s() * diag[k] + rot.c() * subdiag[k];</div> <div class="line"><a name="l00770"></a><span class="lineno"> 770</span>  RealScalar dkp1 = rot.s() * subdiag[k] + rot.c() * diag[k+1];</div> <div class="line"><a name="l00771"></a><span class="lineno"> 771</span> </div> <div class="line"><a name="l00772"></a><span class="lineno"> 772</span>  diag[k] = rot.c() * (rot.c() * diag[k] - rot.s() * subdiag[k]) - rot.s() * (rot.c() * subdiag[k] - rot.s() * diag[k+1]);</div> <div class="line"><a name="l00773"></a><span class="lineno"> 773</span>  diag[k+1] = rot.s() * sdk + rot.c() * dkp1;</div> <div class="line"><a name="l00774"></a><span class="lineno"> 774</span>  subdiag[k] = rot.c() * sdk - rot.s() * dkp1;</div> <div class="line"><a name="l00775"></a><span class="lineno"> 775</span>  </div> <div class="line"><a name="l00776"></a><span class="lineno"> 776</span> </div> <div class="line"><a name="l00777"></a><span class="lineno"> 777</span>  <span class="keywordflow">if</span> (k > start)</div> <div class="line"><a name="l00778"></a><span class="lineno"> 778</span>  subdiag[k - 1] = rot.c() * subdiag[k-1] - rot.s() * z;</div> <div class="line"><a name="l00779"></a><span class="lineno"> 779</span> </div> <div class="line"><a name="l00780"></a><span class="lineno"> 780</span>  x = subdiag[k];</div> <div class="line"><a name="l00781"></a><span class="lineno"> 781</span> </div> <div class="line"><a name="l00782"></a><span class="lineno"> 782</span>  <span class="keywordflow">if</span> (k < end - 1)</div> <div class="line"><a name="l00783"></a><span class="lineno"> 783</span>  {</div> <div class="line"><a name="l00784"></a><span class="lineno"> 784</span>  z = -rot.s() * subdiag[k+1];</div> <div class="line"><a name="l00785"></a><span class="lineno"> 785</span>  subdiag[k + 1] = rot.c() * subdiag[k+1];</div> <div class="line"><a name="l00786"></a><span class="lineno"> 786</span>  }</div> <div class="line"><a name="l00787"></a><span class="lineno"> 787</span>  </div> <div class="line"><a name="l00788"></a><span class="lineno"> 788</span>  <span class="comment">// apply the givens rotation to the unit matrix Q = Q * G</span></div> <div class="line"><a name="l00789"></a><span class="lineno"> 789</span>  <span class="keywordflow">if</span> (matrixQ)</div> <div class="line"><a name="l00790"></a><span class="lineno"> 790</span>  {</div> <div class="line"><a name="l00791"></a><span class="lineno"> 791</span>  <span class="comment">// FIXME if StorageOrder == RowMajor this operation is not very efficient</span></div> <div class="line"><a name="l00792"></a><span class="lineno"> 792</span>  Map<Matrix<Scalar,Dynamic,Dynamic,StorageOrder> > q(matrixQ,n,n);</div> <div class="line"><a name="l00793"></a><span class="lineno"> 793</span>  q.applyOnTheRight(k,k+1,rot);</div> <div class="line"><a name="l00794"></a><span class="lineno"> 794</span>  }</div> <div class="line"><a name="l00795"></a><span class="lineno"> 795</span>  }</div> <div class="line"><a name="l00796"></a><span class="lineno"> 796</span> }</div> <div class="line"><a name="l00797"></a><span class="lineno"> 797</span> </div> <div class="line"><a name="l00798"></a><span class="lineno"> 798</span> } <span class="comment">// end namespace internal</span></div> <div class="line"><a name="l00799"></a><span class="lineno"> 799</span> </div> <div class="line"><a name="l00800"></a><span class="lineno"> 800</span> } <span class="comment">// end namespace Eigen</span></div> <div class="line"><a name="l00801"></a><span class="lineno"> 801</span> </div> <div class="line"><a name="l00802"></a><span class="lineno"> 802</span> <span class="preprocessor">#endif // EIGEN_SELFADJOINTEIGENSOLVER_H</span></div> <div class="ttc" id="classEigen_1_1SelfAdjointEigenSolver_html_a0c06d5c2034ebb329c54235369643ad2"><div class="ttname"><a href="classEigen_1_1SelfAdjointEigenSolver.html#a0c06d5c2034ebb329c54235369643ad2">Eigen::SelfAdjointEigenSolver::info</a></div><div class="ttdeci">ComputationInfo info() const </div><div class="ttdoc">Reports whether previous computation was successful. </div><div class="ttdef"><b>Definition:</b> SelfAdjointEigenSolver.h:310</div></div> <div class="ttc" id="classEigen_1_1SelfAdjointEigenSolver_html_a3f6fc00047c205ee590f676934aab28f"><div class="ttname"><a href="classEigen_1_1SelfAdjointEigenSolver.html#a3f6fc00047c205ee590f676934aab28f">Eigen::SelfAdjointEigenSolver::Scalar</a></div><div class="ttdeci">MatrixType::Scalar Scalar</div><div class="ttdoc">Scalar type for matrices of type _MatrixType. </div><div class="ttdef"><b>Definition:</b> SelfAdjointEigenSolver.h:81</div></div> <div class="ttc" id="classEigen_1_1SelfAdjointEigenSolver_html_a811ad0873e06be5404fc91f64f0f658d"><div class="ttname"><a href="classEigen_1_1SelfAdjointEigenSolver.html#a811ad0873e06be5404fc91f64f0f658d">Eigen::SelfAdjointEigenSolver::operatorInverseSqrt</a></div><div class="ttdeci">MatrixType operatorInverseSqrt() const </div><div class="ttdoc">Computes the inverse square root of the matrix. </div><div class="ttdef"><b>Definition:</b> SelfAdjointEigenSolver.h:299</div></div> <div class="ttc" id="group__enums_html_gga2d78499b99ddc29b9494f7ea33864d52a92a556ff1203acee3bacb02b0d157870"><div class="ttname"><a href="group__enums.html#gga2d78499b99ddc29b9494f7ea33864d52a92a556ff1203acee3bacb02b0d157870">Eigen::ComputeEigenvectors</a></div><div class="ttdef"><b>Definition:</b> Constants.h:339</div></div> <div class="ttc" id="classEigen_1_1SelfAdjointEigenSolver_html_af54b25fe7d2a3f578269381e9e5592a2"><div class="ttname"><a href="classEigen_1_1SelfAdjointEigenSolver.html#af54b25fe7d2a3f578269381e9e5592a2">Eigen::SelfAdjointEigenSolver::eigenvalues</a></div><div class="ttdeci">const RealVectorType & eigenvalues() const </div><div class="ttdoc">Returns the eigenvalues of given matrix. </div><div class="ttdef"><b>Definition:</b> SelfAdjointEigenSolver.h:250</div></div> <div class="ttc" id="classEigen_1_1SelfAdjointEigenSolver_html_a30caf3c3884a7f4a46b8ec94efd23c5e"><div class="ttname"><a href="classEigen_1_1SelfAdjointEigenSolver.html#a30caf3c3884a7f4a46b8ec94efd23c5e">Eigen::SelfAdjointEigenSolver::SelfAdjointEigenSolver</a></div><div class="ttdeci">SelfAdjointEigenSolver(const MatrixType &matrix, int options=ComputeEigenvectors)</div><div class="ttdoc">Constructor; computes eigendecomposition of given matrix. </div><div class="ttdef"><b>Definition:</b> SelfAdjointEigenSolver.h:153</div></div> <div class="ttc" id="group__enums_html_gga51bc1ac16f26ebe51eae1abb77bd037ba710fff14e8fc77846d4b75d8f4cc2d5c"><div class="ttname"><a href="group__enums.html#gga51bc1ac16f26ebe51eae1abb77bd037ba710fff14e8fc77846d4b75d8f4cc2d5c">Eigen::NumericalIssue</a></div><div class="ttdef"><b>Definition:</b> Constants.h:378</div></div> <div class="ttc" id="classEigen_1_1SelfAdjointEigenSolver_html_afacfaa11c727d3043d525f577b22c524"><div class="ttname"><a href="classEigen_1_1SelfAdjointEigenSolver.html#afacfaa11c727d3043d525f577b22c524">Eigen::SelfAdjointEigenSolver::SelfAdjointEigenSolver</a></div><div class="ttdeci">SelfAdjointEigenSolver(Index size)</div><div class="ttdoc">Constructor, pre-allocates memory for dynamic-size matrices. </div><div class="ttdef"><b>Definition:</b> SelfAdjointEigenSolver.h:131</div></div> <div class="ttc" id="classEigen_1_1SelfAdjointEigenSolver_html"><div class="ttname"><a href="classEigen_1_1SelfAdjointEigenSolver.html">Eigen::SelfAdjointEigenSolver</a></div><div class="ttdoc">Computes eigenvalues and eigenvectors of selfadjoint matrices. </div><div class="ttdef"><b>Definition:</b> SelfAdjointEigenSolver.h:68</div></div> <div class="ttc" id="structEigen_1_1NumTraits_html"><div class="ttname"><a href="structEigen_1_1NumTraits.html">Eigen::NumTraits</a></div><div class="ttdoc">Holds information about the various numeric (i.e. scalar) types allowed by Eigen. ...</div><div class="ttdef"><b>Definition:</b> NumTraits.h:88</div></div> <div class="ttc" id="classEigen_1_1Tridiagonalization_html"><div class="ttname"><a href="classEigen_1_1Tridiagonalization.html">Eigen::Tridiagonalization</a></div><div class="ttdoc">Tridiagonal decomposition of a selfadjoint matrix. </div><div class="ttdef"><b>Definition:</b> Tridiagonalization.h:61</div></div> <div class="ttc" id="classEigen_1_1SelfAdjointEigenSolver_html_a85cda7e77edf4923f3fc0512c83f6323"><div class="ttname"><a href="classEigen_1_1SelfAdjointEigenSolver.html#a85cda7e77edf4923f3fc0512c83f6323">Eigen::SelfAdjointEigenSolver::computeDirect</a></div><div class="ttdeci">SelfAdjointEigenSolver & computeDirect(const MatrixType &matrix, int options=ComputeEigenvectors)</div><div class="ttdoc">Computes eigendecomposition of given matrix using a direct algorithm. </div><div class="ttdef"><b>Definition:</b> SelfAdjointEigenSolver.h:732</div></div> <div class="ttc" id="classEigen_1_1GeneralizedSelfAdjointEigenSolver_html"><div class="ttname"><a href="classEigen_1_1GeneralizedSelfAdjointEigenSolver.html">Eigen::GeneralizedSelfAdjointEigenSolver</a></div><div class="ttdoc">Computes eigenvalues and eigenvectors of the generalized selfadjoint eigen problem. </div><div class="ttdef"><b>Definition:</b> GeneralizedSelfAdjointEigenSolver.h:48</div></div> <div class="ttc" id="classEigen_1_1SelfAdjointEigenSolver_html_adc66cd724d769ca37c38bc5ecb06dd87"><div class="ttname"><a href="classEigen_1_1SelfAdjointEigenSolver.html#adc66cd724d769ca37c38bc5ecb06dd87">Eigen::SelfAdjointEigenSolver::m_maxIterations</a></div><div class="ttdeci">static const int m_maxIterations</div><div class="ttdoc">Maximum number of iterations. </div><div class="ttdef"><b>Definition:</b> SelfAdjointEigenSolver.h:321</div></div> <div class="ttc" id="classEigen_1_1SelfAdjointEigenSolver_html_add23e44f8a7f540c288ee98b2d2b0775"><div class="ttname"><a href="classEigen_1_1SelfAdjointEigenSolver.html#add23e44f8a7f540c288ee98b2d2b0775">Eigen::SelfAdjointEigenSolver::operatorSqrt</a></div><div class="ttdeci">MatrixType operatorSqrt() const </div><div class="ttdoc">Computes the positive-definite square root of the matrix. </div><div class="ttdef"><b>Definition:</b> SelfAdjointEigenSolver.h:274</div></div> <div class="ttc" id="classEigen_1_1SelfAdjointEigenSolver_html_acb5c3dc237f99cf17167e8a629f01b43"><div class="ttname"><a href="classEigen_1_1SelfAdjointEigenSolver.html#acb5c3dc237f99cf17167e8a629f01b43">Eigen::SelfAdjointEigenSolver::RealScalar</a></div><div class="ttdeci">NumTraits< Scalar >::Real RealScalar</div><div class="ttdoc">Real scalar type for _MatrixType. </div><div class="ttdef"><b>Definition:</b> SelfAdjointEigenSolver.h:90</div></div> <div class="ttc" id="classEigen_1_1SelfAdjointEigenSolver_html_a4e33b38d1980864e689a8a1c01b782dd"><div class="ttname"><a href="classEigen_1_1SelfAdjointEigenSolver.html#a4e33b38d1980864e689a8a1c01b782dd">Eigen::SelfAdjointEigenSolver::RealVectorType</a></div><div class="ttdeci">internal::plain_col_type< MatrixType, RealScalar >::type RealVectorType</div><div class="ttdoc">Type for vector of eigenvalues as returned by eigenvalues(). </div><div class="ttdef"><b>Definition:</b> SelfAdjointEigenSolver.h:99</div></div> <div class="ttc" id="classEigen_1_1SelfAdjointEigenSolver_html_a647a30aac0c6bb3def117dfb5ce90035"><div class="ttname"><a href="classEigen_1_1SelfAdjointEigenSolver.html#a647a30aac0c6bb3def117dfb5ce90035">Eigen::SelfAdjointEigenSolver::eigenvectors</a></div><div class="ttdeci">const MatrixType & eigenvectors() const </div><div class="ttdoc">Returns the eigenvectors of given matrix. </div><div class="ttdef"><b>Definition:</b> SelfAdjointEigenSolver.h:228</div></div> <div class="ttc" id="group__enums_html_gga51bc1ac16f26ebe51eae1abb77bd037ba4ff235bd185f3c5fceeec8d6540eb847"><div class="ttname"><a href="group__enums.html#gga51bc1ac16f26ebe51eae1abb77bd037ba4ff235bd185f3c5fceeec8d6540eb847">Eigen::NoConvergence</a></div><div class="ttdef"><b>Definition:</b> Constants.h:380</div></div> <div class="ttc" id="group__enums_html_gga51bc1ac16f26ebe51eae1abb77bd037bafdfbdf3247bd36a1f17270d5cec74c9c"><div class="ttname"><a href="group__enums.html#gga51bc1ac16f26ebe51eae1abb77bd037bafdfbdf3247bd36a1f17270d5cec74c9c">Eigen::Success</a></div><div class="ttdef"><b>Definition:</b> Constants.h:376</div></div> <div class="ttc" id="classEigen_1_1SelfAdjointEigenSolver_html_aff6f3679ffb0098b33ccdefd4c5aaf33"><div class="ttname"><a href="classEigen_1_1SelfAdjointEigenSolver.html#aff6f3679ffb0098b33ccdefd4c5aaf33">Eigen::SelfAdjointEigenSolver::compute</a></div><div class="ttdeci">SelfAdjointEigenSolver & compute(const MatrixType &matrix, int options=ComputeEigenvectors)</div><div class="ttdoc">Computes eigendecomposition of given matrix. </div><div class="ttdef"><b>Definition:</b> SelfAdjointEigenSolver.h:385</div></div> <div class="ttc" id="group__enums_html_ga51bc1ac16f26ebe51eae1abb77bd037b"><div class="ttname"><a href="group__enums.html#ga51bc1ac16f26ebe51eae1abb77bd037b">Eigen::ComputationInfo</a></div><div class="ttdeci">ComputationInfo</div><div class="ttdef"><b>Definition:</b> Constants.h:374</div></div> <div class="ttc" id="classEigen_1_1SelfAdjointEigenSolver_html_a4cd23cc2295a3daa079898bd4b9b3d4d"><div class="ttname"><a href="classEigen_1_1SelfAdjointEigenSolver.html#a4cd23cc2295a3daa079898bd4b9b3d4d">Eigen::SelfAdjointEigenSolver::SelfAdjointEigenSolver</a></div><div class="ttdeci">SelfAdjointEigenSolver()</div><div class="ttdoc">Default constructor for fixed-size matrices. </div><div class="ttdef"><b>Definition:</b> SelfAdjointEigenSolver.h:112</div></div> <div class="ttc" id="group__enums_html_gga2d78499b99ddc29b9494f7ea33864d52adaf09d7c7a09d6c882b1a871268e87dd"><div class="ttname"><a href="group__enums.html#gga2d78499b99ddc29b9494f7ea33864d52adaf09d7c7a09d6c882b1a871268e87dd">Eigen::EigenvaluesOnly</a></div><div class="ttdef"><b>Definition:</b> Constants.h:336</div></div> </div><!-- fragment --></div><!-- contents --> </div><!-- doc-content --> <!-- start footer part --> <div id="nav-path" class="navpath"><!-- id is needed for treeview function! --> <ul> <li class="navelem"><a class="el" href="dir_e49d68e3078f12dfcf157021597ad168.html">Eigen</a></li><li class="navelem"><a class="el" href="dir_64b228556dc7f9fe757d43bb57fbfc24.html">src</a></li><li class="navelem"><a class="el" href="dir_b3e8aad20632d7b7c332c11ff568cf95.html">Eigenvalues</a></li><li class="navelem"><b>SelfAdjointEigenSolver.h</b></li> <li class="footer">Generated on Mon Oct 28 2013 11:04:25 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>