namespace StormEigen { /** \eigenManualPage LeastSquares Solving linear least squares systems This page describes how to solve linear least squares systems using %Eigen. An overdetermined system of equations, say \a Ax = \a b, has no solutions. In this case, it makes sense to search for the 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. \eigenAutoToc \section LeastSquaresSVD Using the SVD decomposition The \link JacobiSVD::solve() solve() \endlink method in the JacobiSVD class can be directly used to solve linear squares systems. It is not enough to compute only the singular values (the default for this class); you also need the singular vectors but the thin SVD decomposition suffices for computing least squares solutions:
Example:Output:
\include TutorialLinAlgSVDSolve.cpp \verbinclude TutorialLinAlgSVDSolve.out
This is example from the page \link TutorialLinearAlgebra Linear algebra and decompositions \endlink. \section LeastSquaresQR Using the QR decomposition The solve() method in QR decomposition classes also computes the least squares solution. There are three QR decomposition classes: HouseholderQR (no pivoting, so fast but unstable), ColPivHouseholderQR (column pivoting, thus a bit slower but more accurate) and FullPivHouseholderQR (full pivoting, so slowest and most stable). Here is an example with column pivoting:
Example:Output:
\include LeastSquaresQR.cpp \verbinclude LeastSquaresQR.out
\section LeastSquaresNormalEquations Using normal equations Finding the least squares solution of \a Ax = \a b is equivalent to solving the normal equation ATAx = ATb. This leads to the following code
Example:Output:
\include LeastSquaresNormalEquations.cpp \verbinclude LeastSquaresNormalEquations.out
If the matrix \a A is ill-conditioned, then this is not a good method, because the condition number of ATA is the square of the condition number of \a A. This means that you lose twice as many digits using normal equation than if you use the other methods. */ }