C# Triangular Matrix Example

← All NMath Code Examples

 

using System;

using CenterSpace.NMath.Core;
using CenterSpace.NMath.Matrix;

namespace CenterSpace.NMath.Matrix.Examples.CSharp
{
  /// <summary>
  /// A .NET example in C# demonstrating the features of the triangular matrix classes.
  /// </summary>
  class TriangularMatrixExample
  {

    static void Main( string[] args )
    {
      // Set up the parameters that describe the shape of a Hermitian banded matrix.
      int order = 5;

      // Create upper and lower triangular matrices.
      var rng = new RandGenUniform( -1, 1 );
      rng.Reset( 0x124 );
      var A = new DoubleMatrix( order, order, rng );
      var lu = new DoubleLUFact( A );
      var U = new DoubleUpperTriMatrix( lu.U );
      var L = 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] = {0}", U[2, 2] );
      Console.WriteLine( "L[0,3] = {0}", 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.
      double a = 99;
      L[2, 1] = a;
      Console.WriteLine( "L[2,1] = {0}", L[2, 1] ); // 99
      U[0, 2] = a + 1;
      Console.WriteLine( "U[0,2] = {0}", 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] = a;
      }
      catch ( NonModifiableElementException e )
      {
        Console.WriteLine();
        Console.WriteLine( "NonModifiableElementException: {0}", e.Message );
      }

      try
      {
        L[0, 3] = a;
      }
      catch ( NonModifiableElementException e )
      {
        Console.WriteLine();
        Console.WriteLine( "NonModifiableElementException: {0}", e.Message );
      }

      // Scalar multiplication and matrix addition/subtraction are supported.
      DoubleUpperTriMatrix C = a * U;
      DoubleUpperTriMatrix D = C + U;
      Console.WriteLine();
      Console.WriteLine( "D =" );
      Console.WriteLine( D.ToTabDelimited( "G3" ) );

      // Matrix/vector inner products too.
      var x = new DoubleVector( L.Cols, rng );
      DoubleVector y = 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.
      DoubleVector x2 = MatrixFunctions.Solve( L, y );

      // x and x2 should be the same. Let's look at the l2 norm of
      // their difference.
      DoubleVector residual = x - x2;
      double residualL2Norm = Math.Sqrt( NMathFunctions.Dot( residual, residual ) );
      Console.WriteLine( "||x - x2|| = {0}", residualL2Norm );

      // You can calculate the determinant too.
      double det = MatrixFunctions.Determinant( U );
      Console.WriteLine();
      Console.WriteLine( "Determinant of U = {0}", 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" );
      Console.Read();
    }
  }
}

← All NMath Code Examples
Top