Imports System Imports CenterSpace.NMath.Core Namespace CenterSpace.NMath.Examples.VisualBasic A .NET example in Visual Basic demonstrating the features of the banded symmetric matrix classes. Module SymmetricBandMatrixExample Sub Main() Set up the parameters that describe the shape of a Hermitian banded matrix. Dim HalfBandwidth As Integer = 1 Dim Order As Integer = 7 Set up a symmetric banded matrix B by creating a banded matrix, A, with random entries, and setting B equal to the product of the transpose of that matrix with itself. Dim A As New DoubleBandMatrix(Order, Order, HalfBandwidth, HalfBandwidth) Dim Rng As New RandGenUniform(-1, 1) Rng.Reset(&H124) Dim Diag As DoubleVector Fill the non-zero entries of A, a diagonal at a time, with random numbers. Dim I As Integer For I = -A.LowerBandwidth To A.UpperBandwidth Diag = A.Diagonal(I) Dim J As Integer For J = 0 To Diag.Length - 1 Diag(J) = Rng.Next() Next Next Dim B As New DoubleSymBandMatrix(MatrixFunctions.TransposeProduct(A, A)) Console.WriteLine() Console.WriteLine("B =") Console.WriteLine(B.ToTabDelimited("G3")) B = 0.249 -0.0333 0.0835 0 0 0 0 -0.0333 0.121 -0.12 -0.0858 0 0 0 0.0835 -0.12 0.196 0.154 0.231 0 0 0 -0.0858 0.154 0.477 0.581 0.358 0 0 0 0.231 0.581 1.21 0.408 0.152 0 0 0 0.358 0.408 0.512 0.277 0 0 0 0 0.152 0.277 0.647 Indexer accessor works just like it does for general matrices. Console.WriteLine("B[2,2] = " & B(2, 2)) Console.WriteLine("B[5,0] = " & B(5, 0)) You can set the values of elements in the bandwidth of a symmetric banded matrix using the indexer. Note that setting the element in row i and column j to a value implicitly sets the element in column j and row i to the same value. Dim Scalar As Double = 99 B(2, 1) = Scalar Console.WriteLine("B[2,1] = " & B(2, 1)) 99 Console.WriteLine("B[1,2] = " & B(1, 2)) 99 But setting an element outside the bandwidth of the matrix raises a NonModifiableElementException exception Try B(6, 0) = Scalar Catch E As NonModifiableElementException Console.WriteLine() Console.Write("NonModifiableElementException: " & E.Message) Console.WriteLine() End Try Scalar multiplication and matrix addition/subtraction are supported. Dim C As DoubleSymBandMatrix = Scalar * B Dim D As DoubleSymBandMatrix = C + B Console.WriteLine() Console.WriteLine("D =") Console.WriteLine(D.ToTabDelimited("G3")) Matrix/vector inner products too. Dim X As New DoubleVector(B.Cols, Rng) Dim Y As DoubleVector = MatrixFunctions.Product(B, X) Console.Write("Bx = " & Y.ToString("G3")) You can transform the non-zero elements of a banded matrix object by using the Transform() method on its data vector. Change every element of C to its natural log. C.DataVector.Transform(NMathFunctions.LogFunc) Console.WriteLine("ln(C) =") Console.WriteLine(C.ToTabDelimited("G3")) You can also solve linear systems. Dim X2 As DoubleVector = MatrixFunctions.Solve(B, Y) x and x2 should be the same. Lets look at the l2 norm of their difference. Dim Residual As DoubleVector = DoubleVector.Subtract(X, X2) Dim ResidualL2Norm As Double = Math.Sqrt(NMathFunctions.Dot(Residual, Residual)) Console.WriteLine() Console.Write("||x - x2|| = " & ResidualL2Norm) You can calculate the determinant too. Dim Det As Double = MatrixFunctions.Determinant(B) Console.WriteLine() Console.WriteLine() Console.Write("Determinant of B = " & Det) If your symmetric banded matrix is positive definite, you can invoke the Solve function with a third - the isPositiveDefinite parameter - set to true. First make sure B is positive definite. B = New DoubleSymBandMatrix(MatrixFunctions.TransposeProduct(A, A)) Y = MatrixFunctions.Product(B, X) X2 = MatrixFunctions.Solve(B, Y, True) 3rd parameter isPositiveDefinite set to true. See how close Bx is to y by computing the l2 norm of their difference. Residual = X - X2 ResidualL2Norm = Math.Sqrt(NMathFunctions.Dot(Residual, Residual)) Console.WriteLine() Console.WriteLine() Console.Write("PD ||x - x2|| = " & ResidualL2Norm) Console.WriteLine() You can use the Resize() method to change the bandwidths. D.Resize(D.Order, 2) Console.WriteLine() Console.WriteLine("Press Enter Key") Console.Read() End Sub End Module End Namespace← All NMath Code Examples