C# N Math Functions Example

[TOC]

using System;
using System.Globalization;
using System.Threading;

using CenterSpace.NMath.Core;

namespace CenterSpace.NMath.Core.Examples.CSharp
{
  /// <summary>
  /// A .NET example in C# showing some of the functionality of the NMath class.
  /// </summary>
  class NMathExample
  {

    static void Main(string[] args)
    {
      // Most common mathematical functions have been overloaded to accept
      // vector and matrix types. These functions are provided as static
      // methods in the class CenterSpace.NMathFunctions.Core.NMathFunctions. The
      // result of invoking one of these methoods with a vector or matrix
      // argument is a new vector or matrix object of the same size whose
      // values  are the result of applying the function to each element
      // of its argument. 

      Console.WriteLine();

      CultureInfo original = Thread.CurrentThread.CurrentCulture;

      // This example uses strings representing numbers in the US locale
      // so change the current culture info.  For example, "-.5"
      Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");

      FloatVector v = new FloatVector(1.2F, -4.5F, 9.1F, -10.01F);

      // Create a vector whose values are the absolute values of v.
      FloatVector absV = NMathFunctions.Abs(v);

      DoubleComplexMatrix A = new DoubleComplexMatrix("2x2 [(1,-1) (2,-.5) (2.2,1.1) (7,9)]");

      // Back to your original culture.
      Thread.CurrentThread.CurrentCulture = original;

      Console.WriteLine("absV = {0}", absV.ToString()); // absV = [1.2 4.5 9.1 10.01]
      Console.WriteLine();

      // Use the NMath Conj method to obtain a matrix whose elements are 
      // the complex cojugates of the complex matrix A.
      DoubleComplexMatrix AConj = NMathFunctions.Conj(A);

      // AConj = 2x2 [(1,1) (2,0.5) (2.2,-1.1) (7,-9)]
      Console.WriteLine("AConj...");
      Console.WriteLine(AConj);
      Console.WriteLine();

      // Now use the Imag method to create a real matrix containing
      // the imaginary parts of AConj.
      DoubleMatrix AConjImag = NMathFunctions.Imag(AConj);

      // AConjImag = 2x2 [1 0.5 -1.1 -9]
      Console.WriteLine("AConjImag...");
      Console.WriteLine(AConjImag);
      Console.WriteLine();

      // The NMath class also provides static methods for solving
      // linear systems, computing determinants, matrix inverses, and 
      // matrix condition numbers.  See the LU factorization example
      // to see how re-use the LU factorization of a matrix to compute
      // these quantities.
      double detAConjImag = NMathFunctions.Determinant(AConjImag);
      Console.WriteLine("The determinant of AConjImag = {0}", detAConjImag);
      Console.WriteLine();

      // If the determinant is non-zero, the matrix is invertible. So we
      // can compute inverses and solve linear systems.
      if (detAConjImag != 0)
      {
        DoubleMatrix inv = NMathFunctions.Inverse(AConjImag);
        Console.WriteLine("The inverse of AConjImag...");
        Console.WriteLine(inv.ToString("F3"));
        Console.WriteLine();

        DoubleVector b = new DoubleVector("[0 -1]");
        DoubleVector x = NMathFunctions.Solve(AConjImag, b);
        Console.WriteLine("The solution, x to AConjImag*x=b is...");
        Console.WriteLine(x.ToString("F3"));
        Console.WriteLine();

        double conditionNumber = NMathFunctions.EstimateConditionNumber(AConjImag, NormType.OneNorm);
        Console.Write("The condition number of AConjImag in the 1-norm is... ");
        Console.WriteLine(conditionNumber.ToString("F5"));
      }
      else
      {
        Console.WriteLine("Sorry, matrix is singular");
      }

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

    } // Main

  }// class

}// namespace

[TOC]