using System; using System.Collections.Generic; using CenterSpace.NMath.Core; namespace CenterSpace.NMath.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