Imports System Imports CenterSpace.NMath.Core Namespace CenterSpace.NMath.Examples.VisualBasic A .NET example in Visual Basic demonstrating the features of the triangular matrix classes. Module TriangularMatrixExample Sub Main() Set up the parameters that describe the shape of a Hermitian banded matrix. Dim Order As Integer = 5 Create upper and lower triangular matrices. Dim Rng As New RandGenUniform(-1, 1) Rng.Reset(&H124) Dim A As New DoubleMatrix(Order, Order, Rng) Dim LU As New DoubleLUFact(A) Dim U As New DoubleUpperTriMatrix(LU.U) Dim L As New DoubleLowerTriMatrix(LU.L) Console.WriteLine() Console.WriteLine("U =") Console.WriteLine(U.ToTabDelimited("G3")) Console.WriteLine("L =") Console.WriteLine(L.ToTabDelimited("G3")) U = 0.576 -0.325 -0.077 0.773 0.622 0 -0.169 -0.142 0.0948 -0.916 0 0 0.576 0.353 0.207 0 0 0 -1.43 -1.01 0 0 0 0 -0.581 L = 1 0 0 0 0 0.34 1 0 0 0 -0.863 0.581 1 0 0 0.575 -0.843 0.401 1 0 -0.434 0.398 0.422 -0.538 1 Indexer accessor works just like it does for general matrices. Console.WriteLine("U[2,2] = " & U(2, 2)) Console.WriteLine("L[0,3] = " & L(0, 3)) You can set the values of elements in the upper triangular part of a upper triangular matrix and the lower part of a lower triangular matrix. Dim Scalar As Double = 99 L(2, 1) = Scalar Console.WriteLine("L[2,1] = " & L(2, 1)) 99 U(0, 2) = Scalar + 1 Console.WriteLine("U[0,2] = " & U(0, 2)) 100 But setting the values of elements in the lower triangular part of a upper triangular matrix or the upper part of a lower triangular matrix raises a NonModifiableElementException. Try U(3, 0) = Scalar Catch E As NonModifiableElementException Console.WriteLine() Console.WriteLine("NonModifiableElementException: " & E.Message) End Try Try L(0, 3) = Scalar Catch E As NonModifiableElementException Console.WriteLine() Console.WriteLine("NonModifiableElementException: " & E.Message) End Try Scalar multiplication and matrix addition/subtraction are supported. Dim C As DoubleUpperTriMatrix = Scalar * U Dim D As DoubleUpperTriMatrix = C + U Console.WriteLine() Console.WriteLine("D =") Console.WriteLine(D.ToTabDelimited("G3")) Matrix/vector inner products too. Dim X As New DoubleVector(L.Cols, Rng) Dim Y As DoubleVector = MatrixFunctions.Product(L, X) Console.WriteLine("Lx = {0}", Y.ToString()) You can transform the non-zero elements of a triangular matrix object by using the Transform() method on its data vector. Change every element of C to its absolute value. C.DataVector.Transform(NMathFunctions.AbsFunc) Console.WriteLine() Console.WriteLine("abs(C) =") Console.WriteLine(C.ToTabDelimited("G3")) You can also solve linear systems. Dim X2 As DoubleVector = MatrixFunctions.Solve(L, Y) x and x2 should be the same. Lets look at the l2 norm of their difference. Dim Residual As DoubleVector = X - X2 Dim ResidualL2Norm As Double = Math.Sqrt(NMathFunctions.Dot(Residual, Residual)) Console.Write("||x - x2|| = ") Console.WriteLine(ResidualL2Norm) You can calculate the determinant too. Dim Det As Double = MatrixFunctions.Determinant(U) Console.WriteLine() Console.Write("Determinant of U = ") Console.WriteLine(Det) You can use the Resize() method to change the bandwidths. D.Resize(6) Console.WriteLine() Console.WriteLine("D resized =") Console.WriteLine(D.ToTabDelimited("G3")) Console.WriteLine("Press Enter Key") Console.Read() End Sub End Module End Namespace← All NMath Code Examples