← All NMath Code Examples
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Threading;
using System.IO;
using CenterSpace.NMath.Core;
namespace CenterSpace.NMath.Examples.CSharp
{
/// <summary>
/// A .NET example in C# showing simple sparse matrix functionality.
/// </summary>
class SparseMatrixExample
{
static void Main( string[] args )
{
Thread.CurrentThread.CurrentCulture = new CultureInfo( "en-US", false );
Console.WriteLine();
DoubleComplexCsrSparseMatrix A = ReadComplexMtxFile();
Console.WriteLine( "A is a {0}x{1} complex-valued sparse matrix with {2} nonzero entries.",
A.Rows, A.Cols, A.Data.NumberNonZero );
DoubleComplexCsrSparseMatrix AHA = MatrixFunctions.ConjTransposeProduct( A, A );
Console.WriteLine( "The conjugate transpose product of A with itself has {0} nonzero entries.",
AHA.Data.NumberNonZero );
var v = new DoubleComplexVector( A.Cols, 1 );
DoubleComplexVector Av = MatrixFunctions.Product( A, v );
Console.WriteLine( "The product of a with a dense vector, v, has length {0}", Av.Length );
Console.WriteLine();
Console.WriteLine( "Press Enter Key" );
Console.Read();
}
static DoubleComplexCsrSparseMatrix ReadComplexMtxFile()
{
var reader = new StreamReader( new FileStream( "sparseMatData.mtx", FileMode.Open ) );
string line = reader.ReadLine();
char[] delimiters = { };
int lineCount = 0;
int rows = 0, cols = 0, numberNonzero = 0;
// Eat comments.
while ( line.Contains( "%" ) ) line = reader.ReadLine();
var coordValues = new Dictionary<IntPair, DoubleComplex>();
for ( ;;)
{
if ( line == null ) break;
if ( lineCount == 0 ) // First non-comment, read rows, columns, and number nonzero
{
string[] matrixInfo = line.Split( delimiters, StringSplitOptions.RemoveEmptyEntries );
if ( matrixInfo.Length != 3 )
{
throw new Exception( "Invalid MTX file" );
}
rows = Int32.Parse( matrixInfo[0] );
cols = Int32.Parse( matrixInfo[1] );
numberNonzero = Int32.Parse( matrixInfo[2] );
}
else
{
// Line should have 4 entries, a row index, a column index, real and imaginary
// parts of the value.
string[] rowColValue = line.Split( delimiters, StringSplitOptions.RemoveEmptyEntries );
if ( rowColValue.Length != 4 )
{
throw new Exception( "Invalid MTX file" + line );
}
int row = Int32.Parse( rowColValue[0] ) - 1; // mtx files use one-based indexing.
int col = Int32.Parse( rowColValue[1] ) - 1;
double re = Double.Parse( rowColValue[2] );
double im = Double.Parse( rowColValue[3] );
coordValues.Add( new IntPair( row, col ), new DoubleComplex( re, im ) );
}
++lineCount;
line = reader.ReadLine();
}
return new DoubleComplexCsrSparseMatrix( coordValues, cols );
}
}
}
← All NMath Code Examples