VB QR Decomp Example

← All NMath Code Examples

 

Imports System

Imports CenterSpace.NMath.Core


Namespace CenterSpace.NMath.Examples.VisualBasic

  A .NET example in Visual Basic demonstrating the features of the QR decomposition classes.
  Module QRDecompExample

    Sub Main()

      A general m x n system with random entries.
      Dim Rng As New RandGenUniform(-1, 1)
      Rng.Reset(&H124)
      Dim Rows As Integer = 6
      Dim Cols As Integer = 3
      Dim A As New DoubleMatrix(Rows, Cols, Rng)

      Construct a QR decomposition of A.
      Dim Decomp As New DoubleQRDecomp(A)

      Console.WriteLine()

      Look at the components of the factorization AP = QR.
      Console.WriteLine("Q =")
      Console.WriteLine(Decomp.Q.ToTabDelimited("G3"))

      Console.WriteLine("R =")
      Console.WriteLine(Decomp.R.ToTabDelimited("G3"))

      Console.WriteLine("P =")
      Console.WriteLine(Decomp.P.ToTabDelimited())

      Q =
      -0.187  0.516   0.0534
      0.0654  -0.362  0.0361
      0.142   0.331   -0.428
      0.22    -0.597  -0.507
      0.784   0.0122  0.56
      -0.527  -0.37   0.492

      R =
      -1.18   0.264   0.183
      0       -0.869  -0.0966
      0       0       0.745

      P =
      0       1       0
      0       0       1
      1       0       0

      Usually, you do not need to access the components of the 
      decomposition explicitly. There are member functions for
      multiplying by the decomposition components without 
      explicitly constructing them. As an example, lets solve
      the least squares problem Ax = b using a QR decomposition.
      To do this we write A = QR, compute the vector QTb 
      (QT is the transpose of the matrix Q), and solve the upper-
      triangular system Rx = QTb for x. (NOTE: the NMath Matrix library
      contains class DoubleQRLeastSq for solving least squares problems
      using a QR decomposition).
      Dim B As New DoubleVector(A.Rows, Rng)
      Dim W As DoubleVector = Decomp.QTx(B)
      Dim X As DoubleVector = Decomp.Px(Decomp.RInvx(W))

      Console.WriteLine()
      Console.WriteLine("Least squares solution =")
      Console.WriteLine(X.ToString())

      Note that we had to multiply by the permutation matrix to 
      get the components of the solution back in the right order
      since pivoting was done.
      
      Suppose that you wanted to compute a QR decomposition without pivoting.
      The class DoubleQRDecompServer provides control over the pivoting 
      strategy used by the QR decomposition algorithm.
      Dim DecompServer As New DoubleQRDecompServer()
      DecompServer.Pivoting = False

      Use the server to get a decomposition that was computed without pivoting.
      Decomp = DecompServer.GetDecomp(A)

      The permutation matrix should be I, the identity matrix.
      Console.WriteLine()
      Console.WriteLine("P with no pivoting =")
      Console.WriteLine(Decomp.P.ToTabDelimited())

      Use the decomposition to solve the least squares problem again. This
      time we do not need to multiply by P.
      W = Decomp.QTx(B)
      X = Decomp.RInvx(W)

      Console.WriteLine("Least squares solution, no pivoting =")
      Console.WriteLine(X.ToString())

      You can also set the columns of A to be initialcolumns. If the ith column
      of A is set to be an initial column, it is moved to the beginning of AP 
      before the computation, and fixed in place during the computation. If a 
      column of A is set to be a freecolumn, it may be interchanged during the
      computation with any other free column.
      DecompServer.SetInitialColumn(0)   Do not move the first column of A.
      Decomp = DecompServer.GetDecomp(A)
      DecompServer.SetFreeColumn(0)   Set the first column back to a free column.

      Console.WriteLine()
      Console.WriteLine("Press Enter Key")
      Console.Read()

    End Sub
  End Module
End Namespace



← All NMath Code Examples
Top