# VB Triangular Matrix 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 triangular matrix classes.
Module TriangularMatrixExample

Sub Main()

Set up the parameters that describe the shape of a Hermitian banded matrix.
Dim Order As Integer = 5

Create upper and lower triangular matrices.
Dim Rng As New RandGenUniform(-1, 1)
Rng.Reset(&H124)
Dim A As New DoubleMatrix(Order, Order, Rng)
Dim LU As New DoubleLUFact(A)
Dim U As New DoubleUpperTriMatrix(LU.U)
Dim L As New DoubleLowerTriMatrix(LU.L)

Console.WriteLine()

Console.WriteLine("U =")
Console.WriteLine(U.ToTabDelimited("G3"))

Console.WriteLine("L =")
Console.WriteLine(L.ToTabDelimited("G3"))

U =
0.576   -0.325  -0.077  0.773   0.622
0       -0.169  -0.142  0.0948  -0.916
0       0       0.576   0.353   0.207
0       0       0       -1.43   -1.01
0       0       0       0       -0.581

L =
1       0       0       0       0
0.34    1       0       0       0
-0.863  0.581   1       0       0
0.575   -0.843  0.401   1       0
-0.434  0.398   0.422   -0.538  1

Indexer accessor works just like it does for general matrices.
Console.WriteLine("U[2,2] = " & U(2, 2))
Console.WriteLine("L[0,3] = " & L(0, 3))

You can set the values of elements in the upper triangular part
of a upper triangular matrix and the lower part of a lower
triangular matrix.
Dim Scalar As Double = 99
L(2, 1) = Scalar
Console.WriteLine("L[2,1] = " & L(2, 1)) 99
U(0, 2) = Scalar + 1
Console.WriteLine("U[0,2] = " & U(0, 2)) 100

But setting the values of elements in the lower triangular part
of a upper triangular matrix or the upper part of a lower
triangular matrix raises a NonModifiableElementException.
Try
U(3, 0) = Scalar
Catch E As NonModifiableElementException
Console.WriteLine()
Console.WriteLine("NonModifiableElementException: " & E.Message)
End Try

Try
L(0, 3) = Scalar
Catch E As NonModifiableElementException
Console.WriteLine()
Console.WriteLine("NonModifiableElementException: " & E.Message)
End Try

Scalar multiplication and matrix addition/subtraction are supported.
Dim C As DoubleUpperTriMatrix = Scalar * U
Dim D As DoubleUpperTriMatrix = C + U

Console.WriteLine()
Console.WriteLine("D =")
Console.WriteLine(D.ToTabDelimited("G3"))

Matrix/vector inner products too.
Dim X As New DoubleVector(L.Cols, Rng)
Dim Y As DoubleVector = MatrixFunctions.Product(L, X)

Console.WriteLine("Lx = {0}", Y.ToString())

You can transform the non-zero elements of a triangular matrix object
by using the Transform() method on its data vector.
Change every element of C to its absolute value.
C.DataVector.Transform(NMathFunctions.AbsFunc)

Console.WriteLine()
Console.WriteLine("abs(C) =")
Console.WriteLine(C.ToTabDelimited("G3"))

You can also solve linear systems.
Dim X2 As DoubleVector = MatrixFunctions.Solve(L, Y)

x and x2 should be the same. Lets look at the l2 norm of
their difference.
Dim Residual As DoubleVector = X - X2
Dim ResidualL2Norm As Double = Math.Sqrt(NMathFunctions.Dot(Residual, Residual))

Console.Write("||x - x2|| = ")
Console.WriteLine(ResidualL2Norm)

You can calculate the determinant too.
Dim Det As Double = MatrixFunctions.Determinant(U)

Console.WriteLine()
Console.Write("Determinant of U = ")
Console.WriteLine(Det)

You can use the Resize() method to change the bandwidths.
D.Resize(6)

Console.WriteLine()
Console.WriteLine("D resized =")
Console.WriteLine(D.ToTabDelimited("G3"))

Console.WriteLine("Press Enter Key")