C# Sparse Factorization Example

← All NMath Code Examples

 

using System;
using System.Collections.Generic;

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

namespace CenterSpace.NMath.Matrix.Examples.CSharp
{
  /// <summary>
  /// A .NET example in C# showing how to solve a symmetric sparse linear system using the 
  /// DoubleSparseSymFact class.
  /// </summary>
  class SparseFactorizationExample
  {

    static void Main( string[] args )
    {
      var values = new Dictionary<IntPair, double>();
      values.Add( new IntPair( 0, 0 ), 7 );
      values.Add( new IntPair( 0, 2 ), 1 );
      values.Add( new IntPair( 0, 5 ), 2 );
      values.Add( new IntPair( 0, 6 ), 7 );

      values.Add( new IntPair( 1, 1 ), -4 );
      values.Add( new IntPair( 1, 2 ), 8 );
      values.Add( new IntPair( 1, 4 ), 2 );

      values.Add( new IntPair( 2, 2 ), 1 );
      values.Add( new IntPair( 2, 7 ), 5 );

      values.Add( new IntPair( 3, 3 ), 7 );
      values.Add( new IntPair( 3, 6 ), 9 );

      values.Add( new IntPair( 4, 4 ), 5 );
      values.Add( new IntPair( 4, 5 ), 1 );
      values.Add( new IntPair( 4, 6 ), 5 );

      values.Add( new IntPair( 5, 5 ), -1 );
      values.Add( new IntPair( 5, 7 ), 5 );

      values.Add( new IntPair( 6, 6 ), 11 );

      values.Add( new IntPair( 7, 7 ), 5 );

      // Create a symmetric sparse matrix with 8 columns from the above data.
      var S = new DoubleSymCsrSparseMatrix( values, 8 );

      // Factor the matrix. The factorization can then be used to solve for various
      // right hand sides.
      var fact = new DoubleSparseSymFact( S );

      Console.WriteLine();

      // Check that factorization succeeded.
      if ( fact.ErrorStatus != SparseMatrixFact<double>.Error.NoError )
      {
        Console.WriteLine( "Error {0} in factoring sparse matrix S.", fact.ErrorStatus );
        return;
      }

      // Right hand side a vector containing all ones.
      var b = new DoubleVector( 8, 1 );
      DoubleVector x = fact.Solve( b );
      // Check that solve succeeded.
      if ( fact.ErrorStatus != SparseMatrixFact<double>.Error.NoError )
      {
        Console.WriteLine( "Error {0} in solving sparse system Sx = b.", fact.ErrorStatus );
        return;
      }
      Console.WriteLine( "Solution for one right hand side" );
      Console.WriteLine( x.ToString( "G5" ) );

      // Solve for several right hand sides.
      int nrhs = 3;
      var B = new DoubleMatrix( 8, nrhs, new RandGenBeta() );
      DoubleMatrix X = fact.Solve( B );
      // Check that solve succeeded.
      if ( fact.ErrorStatus != SparseMatrixFact<double>.Error.NoError )
      {
        Console.WriteLine( "Error {0} in solving sparse system Sx = b.", fact.ErrorStatus );
        return;
      }
      Console.WriteLine();
      Console.WriteLine( "Solving for {0} right hand sides.", nrhs );
      for ( int i = 0; i < nrhs; i++ )
      {
        Console.WriteLine();
        Console.WriteLine( "Solution for rhs" );
        Console.WriteLine( B.Col( i ).ToString( "G5" ) );
        Console.WriteLine( "is" );
        Console.WriteLine( X.Col( i ).ToString( "G5" ) );
      }

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

← All NMath Code Examples
Top