1*bf2c3715SXin Linamespace Eigen { 2*bf2c3715SXin Li 3*bf2c3715SXin Li/** \eigenManualPage TopicLinearAlgebraDecompositions Catalogue of dense decompositions 4*bf2c3715SXin Li 5*bf2c3715SXin LiThis page presents a catalogue of the dense matrix decompositions offered by Eigen. 6*bf2c3715SXin LiFor an introduction on linear solvers and decompositions, check this \link TutorialLinearAlgebra page \endlink. 7*bf2c3715SXin LiTo get an overview of the true relative speed of the different decompositions, check this \link DenseDecompositionBenchmark benchmark \endlink. 8*bf2c3715SXin Li 9*bf2c3715SXin Li\section TopicLinAlgBigTable Catalogue of decompositions offered by Eigen 10*bf2c3715SXin Li 11*bf2c3715SXin Li<table class="manual-vl"> 12*bf2c3715SXin Li <tr> 13*bf2c3715SXin Li <th class="meta"></th> 14*bf2c3715SXin Li <th class="meta" colspan="5">Generic information, not Eigen-specific</th> 15*bf2c3715SXin Li <th class="meta" colspan="3">Eigen-specific</th> 16*bf2c3715SXin Li </tr> 17*bf2c3715SXin Li 18*bf2c3715SXin Li <tr> 19*bf2c3715SXin Li <th>Decomposition</th> 20*bf2c3715SXin Li <th>Requirements on the matrix</th> 21*bf2c3715SXin Li <th>Speed</th> 22*bf2c3715SXin Li <th>Algorithm reliability and accuracy</th> 23*bf2c3715SXin Li <th>Rank-revealing</th> 24*bf2c3715SXin Li <th>Allows to compute (besides linear solving)</th> 25*bf2c3715SXin Li <th>Linear solver provided by Eigen</th> 26*bf2c3715SXin Li <th>Maturity of Eigen's implementation</th> 27*bf2c3715SXin Li <th>Optimizations</th> 28*bf2c3715SXin Li </tr> 29*bf2c3715SXin Li 30*bf2c3715SXin Li <tr> 31*bf2c3715SXin Li <td>PartialPivLU</td> 32*bf2c3715SXin Li <td>Invertible</td> 33*bf2c3715SXin Li <td>Fast</td> 34*bf2c3715SXin Li <td>Depends on condition number</td> 35*bf2c3715SXin Li <td>-</td> 36*bf2c3715SXin Li <td>-</td> 37*bf2c3715SXin Li <td>Yes</td> 38*bf2c3715SXin Li <td>Excellent</td> 39*bf2c3715SXin Li <td>Blocking, Implicit MT</td> 40*bf2c3715SXin Li </tr> 41*bf2c3715SXin Li 42*bf2c3715SXin Li <tr class="alt"> 43*bf2c3715SXin Li <td>FullPivLU</td> 44*bf2c3715SXin Li <td>-</td> 45*bf2c3715SXin Li <td>Slow</td> 46*bf2c3715SXin Li <td>Proven</td> 47*bf2c3715SXin Li <td>Yes</td> 48*bf2c3715SXin Li <td>-</td> 49*bf2c3715SXin Li <td>Yes</td> 50*bf2c3715SXin Li <td>Excellent</td> 51*bf2c3715SXin Li <td>-</td> 52*bf2c3715SXin Li </tr> 53*bf2c3715SXin Li 54*bf2c3715SXin Li <tr> 55*bf2c3715SXin Li <td>HouseholderQR</td> 56*bf2c3715SXin Li <td>-</td> 57*bf2c3715SXin Li <td>Fast</td> 58*bf2c3715SXin Li <td>Depends on condition number</td> 59*bf2c3715SXin Li <td>-</td> 60*bf2c3715SXin Li <td>Orthogonalization</td> 61*bf2c3715SXin Li <td>Yes</td> 62*bf2c3715SXin Li <td>Excellent</td> 63*bf2c3715SXin Li <td>Blocking</td> 64*bf2c3715SXin Li </tr> 65*bf2c3715SXin Li 66*bf2c3715SXin Li <tr class="alt"> 67*bf2c3715SXin Li <td>ColPivHouseholderQR</td> 68*bf2c3715SXin Li <td>-</td> 69*bf2c3715SXin Li <td>Fast</td> 70*bf2c3715SXin Li <td>Good</td> 71*bf2c3715SXin Li <td>Yes</td> 72*bf2c3715SXin Li <td>Orthogonalization</td> 73*bf2c3715SXin Li <td>Yes</td> 74*bf2c3715SXin Li <td>Excellent</td> 75*bf2c3715SXin Li <td><em>-</em></td> 76*bf2c3715SXin Li </tr> 77*bf2c3715SXin Li 78*bf2c3715SXin Li <tr> 79*bf2c3715SXin Li <td>FullPivHouseholderQR</td> 80*bf2c3715SXin Li <td>-</td> 81*bf2c3715SXin Li <td>Slow</td> 82*bf2c3715SXin Li <td>Proven</td> 83*bf2c3715SXin Li <td>Yes</td> 84*bf2c3715SXin Li <td>Orthogonalization</td> 85*bf2c3715SXin Li <td>Yes</td> 86*bf2c3715SXin Li <td>Average</td> 87*bf2c3715SXin Li <td>-</td> 88*bf2c3715SXin Li </tr> 89*bf2c3715SXin Li 90*bf2c3715SXin Li <tr class="alt"> 91*bf2c3715SXin Li <td>CompleteOrthogonalDecomposition</td> 92*bf2c3715SXin Li <td>-</td> 93*bf2c3715SXin Li <td>Fast</td> 94*bf2c3715SXin Li <td>Good</td> 95*bf2c3715SXin Li <td>Yes</td> 96*bf2c3715SXin Li <td>Orthogonalization</td> 97*bf2c3715SXin Li <td>Yes</td> 98*bf2c3715SXin Li <td>Excellent</td> 99*bf2c3715SXin Li <td><em>-</em></td> 100*bf2c3715SXin Li </tr> 101*bf2c3715SXin Li 102*bf2c3715SXin Li <tr> 103*bf2c3715SXin Li <td>LLT</td> 104*bf2c3715SXin Li <td>Positive definite</td> 105*bf2c3715SXin Li <td>Very fast</td> 106*bf2c3715SXin Li <td>Depends on condition number</td> 107*bf2c3715SXin Li <td>-</td> 108*bf2c3715SXin Li <td>-</td> 109*bf2c3715SXin Li <td>Yes</td> 110*bf2c3715SXin Li <td>Excellent</td> 111*bf2c3715SXin Li <td>Blocking</td> 112*bf2c3715SXin Li </tr> 113*bf2c3715SXin Li 114*bf2c3715SXin Li <tr class="alt"> 115*bf2c3715SXin Li <td>LDLT</td> 116*bf2c3715SXin Li <td>Positive or negative semidefinite<sup><a href="#note1">1</a></sup></td> 117*bf2c3715SXin Li <td>Very fast</td> 118*bf2c3715SXin Li <td>Good</td> 119*bf2c3715SXin Li <td>-</td> 120*bf2c3715SXin Li <td>-</td> 121*bf2c3715SXin Li <td>Yes</td> 122*bf2c3715SXin Li <td>Excellent</td> 123*bf2c3715SXin Li <td><em>Soon: blocking</em></td> 124*bf2c3715SXin Li </tr> 125*bf2c3715SXin Li 126*bf2c3715SXin Li <tr><th class="inter" colspan="9">\n Singular values and eigenvalues decompositions</th></tr> 127*bf2c3715SXin Li 128*bf2c3715SXin Li <tr> 129*bf2c3715SXin Li <td>BDCSVD (divide \& conquer)</td> 130*bf2c3715SXin Li <td>-</td> 131*bf2c3715SXin Li <td>One of the fastest SVD algorithms</td> 132*bf2c3715SXin Li <td>Excellent</td> 133*bf2c3715SXin Li <td>Yes</td> 134*bf2c3715SXin Li <td>Singular values/vectors, least squares</td> 135*bf2c3715SXin Li <td>Yes (and does least squares)</td> 136*bf2c3715SXin Li <td>Excellent</td> 137*bf2c3715SXin Li <td>Blocked bidiagonalization</td> 138*bf2c3715SXin Li </tr> 139*bf2c3715SXin Li 140*bf2c3715SXin Li <tr> 141*bf2c3715SXin Li <td>JacobiSVD (two-sided)</td> 142*bf2c3715SXin Li <td>-</td> 143*bf2c3715SXin Li <td>Slow (but fast for small matrices)</td> 144*bf2c3715SXin Li <td>Proven<sup><a href="#note3">3</a></sup></td> 145*bf2c3715SXin Li <td>Yes</td> 146*bf2c3715SXin Li <td>Singular values/vectors, least squares</td> 147*bf2c3715SXin Li <td>Yes (and does least squares)</td> 148*bf2c3715SXin Li <td>Excellent</td> 149*bf2c3715SXin Li <td>R-SVD</td> 150*bf2c3715SXin Li </tr> 151*bf2c3715SXin Li 152*bf2c3715SXin Li <tr class="alt"> 153*bf2c3715SXin Li <td>SelfAdjointEigenSolver</td> 154*bf2c3715SXin Li <td>Self-adjoint</td> 155*bf2c3715SXin Li <td>Fast-average<sup><a href="#note2">2</a></sup></td> 156*bf2c3715SXin Li <td>Good</td> 157*bf2c3715SXin Li <td>Yes</td> 158*bf2c3715SXin Li <td>Eigenvalues/vectors</td> 159*bf2c3715SXin Li <td>-</td> 160*bf2c3715SXin Li <td>Excellent</td> 161*bf2c3715SXin Li <td><em>Closed forms for 2x2 and 3x3</em></td> 162*bf2c3715SXin Li </tr> 163*bf2c3715SXin Li 164*bf2c3715SXin Li <tr> 165*bf2c3715SXin Li <td>ComplexEigenSolver</td> 166*bf2c3715SXin Li <td>Square</td> 167*bf2c3715SXin Li <td>Slow-very slow<sup><a href="#note2">2</a></sup></td> 168*bf2c3715SXin Li <td>Depends on condition number</td> 169*bf2c3715SXin Li <td>Yes</td> 170*bf2c3715SXin Li <td>Eigenvalues/vectors</td> 171*bf2c3715SXin Li <td>-</td> 172*bf2c3715SXin Li <td>Average</td> 173*bf2c3715SXin Li <td>-</td> 174*bf2c3715SXin Li </tr> 175*bf2c3715SXin Li 176*bf2c3715SXin Li <tr class="alt"> 177*bf2c3715SXin Li <td>EigenSolver</td> 178*bf2c3715SXin Li <td>Square and real</td> 179*bf2c3715SXin Li <td>Average-slow<sup><a href="#note2">2</a></sup></td> 180*bf2c3715SXin Li <td>Depends on condition number</td> 181*bf2c3715SXin Li <td>Yes</td> 182*bf2c3715SXin Li <td>Eigenvalues/vectors</td> 183*bf2c3715SXin Li <td>-</td> 184*bf2c3715SXin Li <td>Average</td> 185*bf2c3715SXin Li <td>-</td> 186*bf2c3715SXin Li </tr> 187*bf2c3715SXin Li 188*bf2c3715SXin Li <tr> 189*bf2c3715SXin Li <td>GeneralizedSelfAdjointEigenSolver</td> 190*bf2c3715SXin Li <td>Square</td> 191*bf2c3715SXin Li <td>Fast-average<sup><a href="#note2">2</a></sup></td> 192*bf2c3715SXin Li <td>Depends on condition number</td> 193*bf2c3715SXin Li <td>-</td> 194*bf2c3715SXin Li <td>Generalized eigenvalues/vectors</td> 195*bf2c3715SXin Li <td>-</td> 196*bf2c3715SXin Li <td>Good</td> 197*bf2c3715SXin Li <td>-</td> 198*bf2c3715SXin Li </tr> 199*bf2c3715SXin Li 200*bf2c3715SXin Li <tr><th class="inter" colspan="9">\n Helper decompositions</th></tr> 201*bf2c3715SXin Li 202*bf2c3715SXin Li <tr> 203*bf2c3715SXin Li <td>RealSchur</td> 204*bf2c3715SXin Li <td>Square and real</td> 205*bf2c3715SXin Li <td>Average-slow<sup><a href="#note2">2</a></sup></td> 206*bf2c3715SXin Li <td>Depends on condition number</td> 207*bf2c3715SXin Li <td>Yes</td> 208*bf2c3715SXin Li <td>-</td> 209*bf2c3715SXin Li <td>-</td> 210*bf2c3715SXin Li <td>Average</td> 211*bf2c3715SXin Li <td>-</td> 212*bf2c3715SXin Li </tr> 213*bf2c3715SXin Li 214*bf2c3715SXin Li <tr class="alt"> 215*bf2c3715SXin Li <td>ComplexSchur</td> 216*bf2c3715SXin Li <td>Square</td> 217*bf2c3715SXin Li <td>Slow-very slow<sup><a href="#note2">2</a></sup></td> 218*bf2c3715SXin Li <td>Depends on condition number</td> 219*bf2c3715SXin Li <td>Yes</td> 220*bf2c3715SXin Li <td>-</td> 221*bf2c3715SXin Li <td>-</td> 222*bf2c3715SXin Li <td>Average</td> 223*bf2c3715SXin Li <td>-</td> 224*bf2c3715SXin Li </tr> 225*bf2c3715SXin Li 226*bf2c3715SXin Li <tr class="alt"> 227*bf2c3715SXin Li <td>Tridiagonalization</td> 228*bf2c3715SXin Li <td>Self-adjoint</td> 229*bf2c3715SXin Li <td>Fast</td> 230*bf2c3715SXin Li <td>Good</td> 231*bf2c3715SXin Li <td>-</td> 232*bf2c3715SXin Li <td>-</td> 233*bf2c3715SXin Li <td>-</td> 234*bf2c3715SXin Li <td>Good</td> 235*bf2c3715SXin Li <td><em>Soon: blocking</em></td> 236*bf2c3715SXin Li </tr> 237*bf2c3715SXin Li 238*bf2c3715SXin Li <tr> 239*bf2c3715SXin Li <td>HessenbergDecomposition</td> 240*bf2c3715SXin Li <td>Square</td> 241*bf2c3715SXin Li <td>Average</td> 242*bf2c3715SXin Li <td>Good</td> 243*bf2c3715SXin Li <td>-</td> 244*bf2c3715SXin Li <td>-</td> 245*bf2c3715SXin Li <td>-</td> 246*bf2c3715SXin Li <td>Good</td> 247*bf2c3715SXin Li <td><em>Soon: blocking</em></td> 248*bf2c3715SXin Li </tr> 249*bf2c3715SXin Li 250*bf2c3715SXin Li</table> 251*bf2c3715SXin Li 252*bf2c3715SXin Li\b Notes: 253*bf2c3715SXin Li<ul> 254*bf2c3715SXin Li<li><a name="note1">\b 1: </a>There exist two variants of the LDLT algorithm. Eigen's one produces a pure diagonal D matrix, and therefore it cannot handle indefinite matrices, unlike Lapack's one which produces a block diagonal D matrix.</li> 255*bf2c3715SXin Li<li><a name="note2">\b 2: </a>Eigenvalues, SVD and Schur decompositions rely on iterative algorithms. Their convergence speed depends on how well the eigenvalues are separated.</li> 256*bf2c3715SXin Li<li><a name="note3">\b 3: </a>Our JacobiSVD is two-sided, making for proven and optimal precision for square matrices. For non-square matrices, we have to use a QR preconditioner first. The default choice, ColPivHouseholderQR, is already very reliable, but if you want it to be proven, use FullPivHouseholderQR instead. 257*bf2c3715SXin Li</ul> 258*bf2c3715SXin Li 259*bf2c3715SXin Li\section TopicLinAlgTerminology Terminology 260*bf2c3715SXin Li 261*bf2c3715SXin Li<dl> 262*bf2c3715SXin Li <dt><b>Selfadjoint</b></dt> 263*bf2c3715SXin Li <dd>For a real matrix, selfadjoint is a synonym for symmetric. For a complex matrix, selfadjoint is a synonym for \em hermitian. 264*bf2c3715SXin Li More generally, a matrix \f$ A \f$ is selfadjoint if and only if it is equal to its adjoint \f$ A^* \f$. The adjoint is also called the \em conjugate \em transpose. </dd> 265*bf2c3715SXin Li <dt><b>Positive/negative definite</b></dt> 266*bf2c3715SXin Li <dd>A selfadjoint matrix \f$ A \f$ is positive definite if \f$ v^* A v > 0 \f$ for any non zero vector \f$ v \f$. 267*bf2c3715SXin Li In the same vein, it is negative definite if \f$ v^* A v < 0 \f$ for any non zero vector \f$ v \f$ </dd> 268*bf2c3715SXin Li <dt><b>Positive/negative semidefinite</b></dt> 269*bf2c3715SXin Li <dd>A selfadjoint matrix \f$ A \f$ is positive semi-definite if \f$ v^* A v \ge 0 \f$ for any non zero vector \f$ v \f$. 270*bf2c3715SXin Li In the same vein, it is negative semi-definite if \f$ v^* A v \le 0 \f$ for any non zero vector \f$ v \f$ </dd> 271*bf2c3715SXin Li 272*bf2c3715SXin Li <dt><b>Blocking</b></dt> 273*bf2c3715SXin Li <dd>Means the algorithm can work per block, whence guaranteeing a good scaling of the performance for large matrices.</dd> 274*bf2c3715SXin Li <dt><b>Implicit Multi Threading (MT)</b></dt> 275*bf2c3715SXin Li <dd>Means the algorithm can take advantage of multicore processors via OpenMP. "Implicit" means the algortihm itself is not parallelized, but that it relies on parallelized matrix-matrix product routines.</dd> 276*bf2c3715SXin Li <dt><b>Explicit Multi Threading (MT)</b></dt> 277*bf2c3715SXin Li <dd>Means the algorithm is explicitly parallelized to take advantage of multicore processors via OpenMP.</dd> 278*bf2c3715SXin Li <dt><b>Meta-unroller</b></dt> 279*bf2c3715SXin Li <dd>Means the algorithm is automatically and explicitly unrolled for very small fixed size matrices.</dd> 280*bf2c3715SXin Li <dt><b></b></dt> 281*bf2c3715SXin Li <dd></dd> 282*bf2c3715SXin Li</dl> 283*bf2c3715SXin Li 284*bf2c3715SXin Li 285*bf2c3715SXin Li*/ 286*bf2c3715SXin Li 287*bf2c3715SXin Li} 288