C# Matrix Range Example

← All NMath Code Examples

 

using System;

using CenterSpace.NMath.Core;

namespace CenterSpace.NMath.Examples.CSharp
{
  /// <summary>
  /// A .NET example in C# showing how to use the indexing class Range with the matrix classes.
  /// </summary>
  public class MatrixRangeExample
  {
    static void Main( string[] args )
    {
      int rows = 5, cols = 5;
      
      var A = new DoubleMatrix( rows, cols, 0, 1 );

      //     | 0  5  10  15  20 |
      //     | 1  6  11  16  21 |
      // A = | 2  7  12  17  22 |
      //     | 3  8  13  18  23 |
      //     | 4  9  14  19  24 |

      Console.WriteLine();

      Console.WriteLine( "A..." );
      Console.WriteLine( A.ToTabDelimited() );
      Console.WriteLine();

      // Last two columns of the matrix A:
      var colRange = new Range( 3, 4 );
      var rowRange = Range.All;
      DoubleMatrix ALast2Col = A[rowRange, colRange];

      //             | 15  20 |
      //             | 16  21 |
      // ALast2Col = | 17  22 |
      //             | 18  23 |
      //             | 19  24 |
      Console.WriteLine( "ALast2Col..." );
      Console.WriteLine( ALast2Col.ToTabDelimited() );
      Console.WriteLine();

      // Could also get this by specifying all elements from the 4th column
      // to the end using the End value from the enum 
      // CenterSpace.NMathFunctions.Core.Position
      ALast2Col = A[rowRange, new Range( 3, Position.End )];
      Console.WriteLine( "ALast2Col..." );
      Console.WriteLine( ALast2Col.ToTabDelimited() );
      Console.WriteLine();

      // You can use negative strides too. Here is the matrix A, reversed.
      // We re-use the Range objects, setting their start, stop, and stride
      // fields using the Set method.
      rowRange = new Range( rows - 1, 0, -1 );
      colRange.Set( cols - 1, 0, -1 );
      DoubleMatrix ARev = A[rowRange, colRange];

      //        | 24  19  14  9  4 |
      //        | 23  18  13  8  3 |
      // ARev = | 22  17  12  7  2 |
      //        | 21  16  11  6  1 |
      //        | 20  15  10  5  0 |
      Console.WriteLine( "ARev..." );
      Console.WriteLine( ARev.ToTabDelimited() );
      Console.WriteLine();

      // Notice that when you create a new DoubleMatrix using the Range or Slice class,
      // you are creating a different "view" of the Matrix data. That is, the 
      // DoubleMatrix instance returned by the indexing operator taking a Range object,
      // and the DoubleMatrix instance being indexed share the same data:
      ARev[0, 0] = 100;
      Console.WriteLine( "ARev[0,0] = {0}", ARev[0, 0] ); // uRev = [0 8 7 6 5 4 3 2 1 0]
      Console.WriteLine();
      Console.WriteLine( "A[{0},{1}] = {2}", rows - 1, cols - 1, A[rows - 1, cols - 1] ); // A[4,4] 
      Console.WriteLine();

      // We now use the DoubleMatrix method Set(Range,Range,value) to change the 
      // contents of A to alternate values 0 and 1 - like a checker board.
      var evenElts = new Range( 0, Position.End, 2 );
      var oddElts = new Range( 1, Position.End, 2 );
      A.Set( evenElts, oddElts, 0 );
      A.Set( evenElts, evenElts, 1 );
      A.Set( oddElts, evenElts, 0 );
      A.Set( oddElts, oddElts, 1 );

      //     | 1  0  1  0  1 |
      //     | 0  1  0  1  0 |
      // A = | 1  0  1  0  1 |
      //     | 0  1  0  1  0 |
      //     | 1  0  1  0  1 |
      Console.WriteLine( "A..." );
      Console.WriteLine( A.ToTabDelimited() );

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

    } // Main

  }// class

}// namespace


← All NMath Code Examples
Top