using System; using CenterSpace.NMath.Core; namespace CenterSpace.NMath.Examples.CSharp { /// <summary> /// A .NET example in C# demonstrating the features of the factorization classes for /// symmetric matrices. /// </summary> class SymFactExample { static void Main( string[] args ) { // Construct a symmetric matrix as the product of the transpose of a // matrix with itself. int rows = 5; int cols = 5; var rng = new RandGenUniform( -1, 1 ); rng.Reset( 0x124 ); var A = new DoubleMatrix( rows, cols, rng ); DoubleMatrix ATA = NMathFunctions.TransposeProduct( A, A ); var S = new DoubleSymmetricMatrix( ATA ); Console.WriteLine(); Console.WriteLine( "S =" ); Console.WriteLine( S.ToTabDelimited( "G3" ) ); // S = // 0.791 -0.366 -0.31 0.183 0.863 // -0.366 0.224 0.177 -0.312 -0.214 // -0.31 0.177 0.49 -0.411 -0.48 // 0.183 -0.312 -0.411 2.03 -0.0979 // 0.863 -0.214 -0.48 -0.0979 2.01 // Construct a symmetric factorization class. var fact = new DoubleSymFact( S ); // Check to see if S is singular. string isSingularString = fact.IsSingular ? "S is singular" : "S is NOT singular"; Console.WriteLine( isSingularString ); // Retrieve information about the matrix S. double det = fact.Determinant(); // In order to get condition number, factor with estimateCondition = true fact.Factor( S, true ); double rcond = fact.ConditionNumber(); DoubleSymmetricMatrix SInv = fact.Inverse(); Console.WriteLine(); Console.WriteLine( "Determinant of S = {0}", det ); Console.WriteLine(); Console.WriteLine( "Reciprocal condition number = {0}", rcond ); Console.WriteLine(); Console.WriteLine( "S inverse =" ); Console.WriteLine( SInv.ToTabDelimited( "G3" ) ); // Use the factorization to solve some linear systems Ax = y. var y0 = new DoubleVector( fact.Cols, rng ); var y1 = new DoubleVector( fact.Cols, rng ); DoubleVector x0 = fact.Solve( y0 ); DoubleVector x1 = fact.Solve( y1 ); Console.WriteLine( "Solution to Ax = y0 is {0}", x0.ToString( "G5" ) ); Console.WriteLine(); Console.WriteLine( "y0 - Ax0 = {0}", ( y0 - MatrixFunctions.Product( S, x0 ) ).ToString( "G5" ) ); Console.WriteLine(); Console.WriteLine( "Solution to Ax = y1 is {0}", x1.ToString( "G5" ) ); Console.WriteLine(); Console.WriteLine( "y1 - Ax1 = {0}", ( y1 - MatrixFunctions.Product( S, x1 ) ).ToString( "G5" ) ); // You can also solve for multiple right-hand sides. var Y = new DoubleMatrix( y1.Length, 2 ); Y.Col( 0 )[Slice.All] = y0; Y.Col( 1 )[Slice.All] = y1; DoubleMatrix X = fact.Solve( Y ); // The first column of X should be x0; the second column should be x1. Console.WriteLine(); Console.WriteLine( "X =" ); Console.WriteLine( X.ToTabDelimited( "G3" ) ); // Factor a different matrix. DoubleSymmetricMatrix B = 1.2 * S; fact.Factor( B ); x0 = fact.Solve( y0 ); Console.WriteLine( "Solution to Bx = y0 is {0}", x0.ToString( "G5" ) ); Console.WriteLine(); Console.WriteLine( "Press Enter Key" ); Console.Read(); } } }← All NMath Code Examples