Solving a Least Squares Problem

Here is a simple program which reads in a matrix and a right side, builds a least squares factorization object, and then calculates the solution to the least squares problem. The program is nearly identical to the first factorization example problem in the previous chapter.

 

#include <iostream> // 1

#include <rw/math/genmat.h>

#include <rw/math/mathvec.h>

#include <rw/lapack/lsqr.h>

#include <rw/lapack/qrcalcp3.h>

 

int main()

{

RWGenMat<float> A; // 2

RWMathVec<float> b;

std::cin >> A >> b;

RWLeastSqQR<float, RWQRCalcP3<float> > ls(A); // 3

RWMathVec<float> x = ls.solve(b); // 4

std::cout << x << std::endl;

 

return 0;

}

// 1  The header file lsqr.h includes the declaration of the least squares class RWLeastSqQR<T,QRCalc>. This is the QR decomposition implementation of the least squares class. Other implementations are described subsequently.

// 2   Here the matrix A and the vector b are defined and read from standard input.

// 3   The least squares decomposition is created from the matrix A. The second template parameter for the class RWLeastSqQR indicates that we are using the class RWQRCalcP3<float> to compute the QR decomposition of A.

// 4   The solution vector is calculated. If the system is overdetermined, this will be the solution that best fits in a least squares sense. If the system is underdetermined, this will be the solution with the smallest norm.