Extreme Optimization >
QuickStart Samples >
Sparse Matrices QuickStart Sample (VB.NET)
Extreme Optimization QuickStart Samples
Sparse Matrices QuickStart Sample (VB.NET)
Illustrates using sparse vectors and matrices using the classes
in the Extreme.Mathematics.LinearAlgebra.Sparse namespace in
Visual Basic .NET.
C# code Back to
QuickStart Samples
' The sparse vector and matrix classes reside in the
' Extreme.Mathematics.LinearAlgebra.Sparse namespace.
Imports Extreme.Mathematics.LinearAlgebra
Imports Extreme.Mathematics.LinearAlgebra.Sparse
Namespace Extreme.Mathematics.QuickStart.VB
' Illustrates using sparse vectors and matrices using the classes
' in the Extreme.Mathematics.LinearAlgebra.Sparse namespace
' of the Extreme Optimization Numerical Libraries for .NET.
Module SparseMatrices
Sub Main()
'
' Sparse vectors
'
' The SparseGeneralVector class has three constructors. The
' first simply takes the length of the vector. All components
' are initially zero.
Dim v1 As SparseGeneralVector = New SparseGeneralVector(1000000)
' The second constructor lets you specify how many components
' are expected to be nonzero. This 'fill factor' is a number
' between 0 and 1.
Dim v2 As SparseGeneralVector = New SparseGeneralVector(1000000, 0.0001)
' The second constructor lets you specify how many components
' are expected to be nonzero. This 'fill factor' is a number
' between 0 and 1.
Dim v3 As SparseGeneralVector = New SparseGeneralVector(1000000, 100)
' The fourth constructor lets you specify the indexes of the nonzero
' components and their values as arrays:
Dim indexes As Integer() = {1, 10, 100, 1000, 10000}
Dim values As Double() = {1.0, 10.0, 100.0, 1000.0, 10000.0}
Dim v4 As SparseGeneralVector = New SparseGeneralVector(1000000, indexes, values)
' Components can be accessed individually:
v1(1000) = 2.0
Console.WriteLine("v1(1000) = {0}", v1(1000))
' The NonzeroCount returns how many components are non zero:
Console.WriteLine("v1 has {0} nonzeros", v1.NonzeroCount)
Console.WriteLine("v4 has {0} nonzeros", v4.NonzeroCount)
' The NonzeroComponents property returns a collection of
' IndexValuePair structures that you can use to iterate
' over the components of the vector:
Console.WriteLine("Nonzero components of v4:")
For Each pair As IndexValuePair In v4.NonzeroComponents
Console.WriteLine("Component {0} = {1}", _
pair.Index, pair.Value)
Next
' All other vector methods and properties are also available,
' Their implementations take advantage of sparsity.
Console.WriteLine("Norm(v4) = {0}", v4.Norm())
Console.WriteLine("Sum(v4) = {0}", v4.GetSum())
' Note that some operations convert a sparse vector to a
' GeneralVector, causing memory to be allocated for all
' components.
'
' Sparse Matrices
'
' All sparse matrix classes inherit from SparseMatrix. This is an abstract class.
' There currently is only one implementation class:
' SparseCompressedColumnMatrix. The class has 4 constructors:
' The first constructor takes the number of rows and columns as arguments:
Dim m1 As SparseCompressedColumnMatrix = _
New SparseCompressedColumnMatrix(100000, 100000)
' The second constructor adds a fill factor:
Dim m2 As SparseCompressedColumnMatrix = _
New SparseCompressedColumnMatrix(100000, 100000, 0.00001)
' The third constructor uses the actual number of nonzero components rather than
' the fraction:
Dim m3 As SparseCompressedColumnMatrix = _
New SparseCompressedColumnMatrix(10000, 10000, 20000)
' The fourth constructor lets you specify the locations and values of the
' nonzero components:
Dim rows As Integer() = {1, 11, 111, 1111}
Dim columns As Integer() = {2, 22, 222, 2222}
Dim matrixValues As Double() = {3.0, 33.0, 333.0, 3333.0}
Dim m4 As SparseCompressedColumnMatrix = _
New SparseCompressedColumnMatrix(10000, 10000, rows, columns, matrixValues)
' You can access components as before...
Console.WriteLine("m4(111, 222) = {0}", m4(111, 222))
m4(99, 22) = 99.0
' A series of Insert methods lets you build a sparse matrix from scratch:
' A single value:
m1.InsertEntry(25.0, 200, 500)
' Multiple values:
m1.InsertEntries(matrixValues, rows, columns)
' Multiple values all in the same column:
m1.InsertColumn(33, values, indexes)
' Multiple values all in the same row:
m1.InsertRow(55, values, indexes)
' A clique is a 2-dimensional submatrix with indexed rows and columns.
Dim clique As GeneralMatrix = New GeneralMatrix(2, 2, New Double() {11, 12, 21, 22})
Dim cliqueIndexes As Integer() = {5, 8}
m1.InsertClique(clique, cliqueIndexes, cliqueIndexes)
' You can use the NonzeroComponents collection to iterate
' over the nonzero components of the matrix. The items
' are of type RowColumnValueTriplet:
Console.WriteLine("Nonzero components of m1:")
For Each triplet As RowColumnValueTriplet In m1.NonzeroComponents
Console.WriteLine("m1({0},{1}) = {2}", _
triplet.Row, triplet.Column, triplet.Value)
Next
' ... including rows and columns.
Dim column As SparseVector = CType(m4.GetColumn(22), SparseVector)
Console.WriteLine("Nonzero components in column 22 of m4:")
For Each pair As IndexValuePair In column.NonzeroComponents
Console.WriteLine("Component {0} = {1}", pair.Index, pair.Value)
Next
' Many matrix methods have been optimized to take advantage of sparsity:
Console.WriteLine("F-norm(m1) = {0}", m1.FrobeniusNorm())
' But beware: some revert to a dense algorithm and will fail on huge matrices:
Try
Dim inverse As Matrix = m1.GetInverse()
Catch e As OutOfMemoryException
Console.WriteLine(e.Message)
End Try
Console.Write("Press Enter key to exit...")
Console.ReadLine()
End Sub
End Module
End Namespace
Copyright 2004-2007,
Extreme Optimization. All rights reserved.
Extreme Optimization, Complexity made simple, M#, and M
Sharp are trademarks of ExoAnalytics Inc.
Microsoft, Visual C#, Visual Basic, Visual Studio, and Visual
Studio.NET are registered trademarks of Microsoft Corporation