mirror of
https://gitlab.com/libeigen/eigen.git
synced 2026-04-10 11:34:33 +08:00
Improve dense linear solver docs with practical guidance
libeigen/eigen!2395 Co-authored-by: Rasmus Munk Larsen <rmlarsen@gmail.com>
This commit is contained in:
@@ -7,13 +7,33 @@ of equations, say \a Ax = \a b, has no solutions. In this case, it makes sense t
|
||||
vector \a x which is closest to being a solution, in the sense that the difference \a Ax - \a b is
|
||||
as small as possible. This \a x is called the least square solution (if the Euclidean norm is used).
|
||||
|
||||
The three methods discussed on this page are the SVD decomposition, the QR decomposition and normal
|
||||
equations. Of these, the SVD decomposition is generally the most accurate but the slowest, normal
|
||||
equations is the fastest but least accurate, and the QR decomposition is in between.
|
||||
The methods discussed on this page are the complete orthogonal decomposition (COD), the SVD
|
||||
decomposition, other QR decompositions, and normal equations. For most problems, we recommend
|
||||
CompleteOrthogonalDecomposition: it robustly computes the minimum-norm least squares solution
|
||||
(like the SVD) for both over- and under-determined systems, including rank-deficient ones, but at
|
||||
QR-like speed. The SVD is the most robust but also the slowest; use it when you also need singular
|
||||
values or vectors. Normal equations are the fastest but least robust.
|
||||
|
||||
\eigenAutoToc
|
||||
|
||||
|
||||
\section LeastSquaresCOD Using the complete orthogonal decomposition (recommended)
|
||||
|
||||
CompleteOrthogonalDecomposition is the recommended method for least squares problems. It handles the
|
||||
widest class of problems — overdetermined, underdetermined, and rank-deficient systems — and computes
|
||||
the minimum-norm solution when the system is rank-deficient or underdetermined, just like the SVD.
|
||||
It is based on a rank-revealing QR factorization (ColPivHouseholderQR) followed by a post-processing
|
||||
step, so it is significantly faster than SVD while providing comparable robustness.
|
||||
|
||||
<table class="example">
|
||||
<tr><th>Example:</th><th>Output:</th></tr>
|
||||
<tr>
|
||||
<td>\include LeastSquaresCOD.cpp </td>
|
||||
<td>\verbinclude LeastSquaresCOD.out </td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
|
||||
\section LeastSquaresSVD Using the SVD decomposition
|
||||
|
||||
The \link BDCSVD::solve() solve() \endlink method in the BDCSVD class can be directly used to
|
||||
@@ -30,16 +50,19 @@ computing least squares solutions:
|
||||
</table>
|
||||
|
||||
This is example from the page \link TutorialLinearAlgebra Linear algebra and decompositions \endlink.
|
||||
If you just need to solve the least squares problem, but are not interested in the SVD per se, a
|
||||
faster alternative method is CompleteOrthogonalDecomposition.
|
||||
The SVD gives you singular values and vectors in addition to the least squares solution, but if you
|
||||
only need the solution, CompleteOrthogonalDecomposition (above) is faster.
|
||||
|
||||
|
||||
\section LeastSquaresQR Using the QR decomposition
|
||||
\section LeastSquaresQR Using other QR decompositions
|
||||
|
||||
The solve() method in QR decomposition classes also computes the least squares solution. There are
|
||||
three QR decomposition classes: HouseholderQR (no pivoting, fast but unstable if your matrix is
|
||||
not rull rank), ColPivHouseholderQR (column pivoting, thus a bit slower but more stable) and
|
||||
FullPivHouseholderQR (full pivoting, so slowest and slightly more stable than ColPivHouseholderQR).
|
||||
The solve() method in QR decomposition classes also computes the least squares solution. Besides
|
||||
CompleteOrthogonalDecomposition (above), there are three other QR decomposition classes:
|
||||
HouseholderQR (no pivoting, so fast but unreliable if your matrix is not full rank),
|
||||
ColPivHouseholderQR (column pivoting, a bit slower but rank-revealing), and FullPivHouseholderQR
|
||||
(full pivoting, significantly slower and rarely needed in practice).
|
||||
Note that only CompleteOrthogonalDecomposition and the SVD-based solvers compute minimum-norm
|
||||
solutions for rank-deficient or underdetermined problems; the other QR variants do not.
|
||||
Here is an example with column pivoting:
|
||||
|
||||
<table class="example">
|
||||
|
||||
Reference in New Issue
Block a user