[TOC]
Imports System
Imports CenterSpace.NMath.Core
Imports CenterSpace.NMath.Matrix
Namespace CenterSpace.NMath.Matrix.Examples.VisualBasic
' A .NET example in VB.NET demonstrating the features of the tridiagonal matrix classes.
Module TridiagonalMatrixExample
Sub Main()
' Set up the parameters that describe the shape of a tridiagonal matrix.
Dim Rows As Integer = 8
Dim Cols As Integer = 8
' Set up a tridiagonal matrix B by setting all the diagonals within the matrix
' bandwidth.
Dim B As New FloatComplexTriDiagMatrix(Rows, Cols)
Dim Diagonal As FloatComplexVector
Dim I As Integer
For I = -1 To 1
Diagonal = B.Diagonal(I)
Diagonal.Set(Slice.All, New FloatComplex(I + 2))
Next
Console.WriteLine()
Console.Write("B = ")
Console.WriteLine(B.ToString())
' B = 8x8 [ (2,0) (3,0) (0,0) (0,0) (0,0) (0,0) (0,0) (0,0)
' (1,0) (2,0) (3,0) (0,0) (0,0) (0,0) (0,0) (0,0)
' (0,0) (1,0) (2,0) (3,0) (0,0) (0,0) (0,0) (0,0)
' (0,0) (0,0) (1,0) (2,0) (3,0) (0,0) (0,0) (0,0)
' (0,0) (0,0) (0,0) (1,0) (2,0) (3,0) (0,0) (0,0)
' (0,0) (0,0) (0,0) (0,0) (1,0) (2,0) (3,0) (0,0)
' (0,0) (0,0) (0,0) (0,0) (0,0) (1,0) (2,0) (3,0)
' (0,0) (0,0) (0,0) (0,0) (0,0) (0,0) (1,0) (2,0)]
' Indexer accessor works just like it does for general matrices.
Console.WriteLine()
Console.Write("B[2,2] = " & B(2, 2).ToString())
Console.Write("B[7,0] = " & B(7, 0).ToString())
' You can set the values of elements in the main, super, and sub diagonals
' of a tridiagonal matrix using the indexer.
B(2, 1) = New FloatComplex(-100, 99)
Console.Write("B[2,1] = ")
Console.WriteLine(B(2, 1))
' But setting an element that would destroy the tridiagonal structure
' of the matrix raises a NonModifiableElementException exception.
Try
B(7, 0) = New FloatComplex(21)
Catch E As NonModifiableElementException
Console.WriteLine()
Console.Write("NonModifiableElementException: ")
Console.WriteLine(E.Message)
End Try
' Scalar addition/subtractions/multiplication and matrix
' addition/subtraction are supported.
Dim S As New FloatComplex(-0.123F)
Dim T As New FloatComplex(3)
Dim C2 As FloatComplexTriDiagMatrix = FloatComplexTriDiagMatrix.Multiply(S, B)
Dim C As FloatComplexTriDiagMatrix = FloatComplexTriDiagMatrix.Subtract(T, B)
Dim D As FloatComplexTriDiagMatrix = FloatComplexTriDiagMatrix.Add(C2, B)
Console.WriteLine()
Console.Write("D = ")
Console.WriteLine(D.ToString())
' Matrix/vector products too.
Dim Rng As New RandGenUniform(-1, 1)
Rng.Reset(&H124)
Dim X As New FloatComplexVector(B.Cols, Rng) ' vector of random deviates
Dim Y As FloatComplexVector = MatrixFunctions.Product(B, X)
Console.WriteLine()
Console.Write("Bx = ")
Console.WriteLine(Y.ToString())
' You can transform the non-zero elements of a banded matrix object by using
' the Transform() method on its data vector.
T = New FloatComplex(2)
C2.DataVector.Transform(NMathFunctions.FloatComplexPowFunction, T) ' Square every element of C2
Console.WriteLine()
Console.Write("C2^2 = ")
Console.WriteLine(C2.ToString())
' You can also solve linear systems.
Dim X2 As FloatComplexVector = MatrixFunctions.Solve(B, Y)
' x and x2 should be about the same. Let's look at the l2 norm of
' their difference.
Dim Residual As FloatComplexVector = X - X2
Dim ResidualL2Norm As Single = Math.Sqrt(NMathFunctions.ConjDot(Residual, Residual).Real)
Console.WriteLine()
Console.Write("||x - x2|| = ")
Console.WriteLine(ResidualL2Norm)
' Compute condition number.
Dim RCond As Single = MatrixFunctions.ConditionNumber(B)
Console.WriteLine()
Console.Write("Reciprocal condition number = ")
Console.WriteLine(RCond)
Console.WriteLine()
Console.WriteLine("Press Enter Key")
Console.Read()
End Sub
End Module
End Namespace
[TOC]