# VB QR Decomp Example

← All NMath Code Examples

```Imports System

Imports CenterSpace.NMath.Core
Imports CenterSpace.NMath.Matrix

Namespace CenterSpace.NMath.Matrix.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, let's 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 'initial' columns. 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 'free' column, 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")