xref: /aosp_15_r20/external/eigen/doc/TopicLinearAlgebraDecompositions.dox (revision bf2c37156dfe67e5dfebd6d394bad8b2ab5804d4)
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