Band Matrices in Visual Basic QuickStart Sample
Illustrates how to work with the BandMatrix class in Visual Basic.
View this sample in: C# F# IronPython
Option Infer On
Imports Numerics.NET
' The BandMatrix class resides in the Numerics.NET.LinearAlgebra
' namespace.
Imports Numerics.NET.LinearAlgebra
Module BandMatrices
' Illustrates the use of the BandMatrix class in the
' Numerics.NET.LinearAlgebra namespace of Numerics.NET.
Sub Main()
' The license is verified at runtime. We're using
' a 30 day trial key here. For more information, see
' https://numerics.net/trial-key
Numerics.NET.License.Verify("64542-18980-57619-62268")
' Band matrices are matrices whose elements
' are nonzero only in a diagonal band around
' the main diagonal.
'
' General band matrices, upper and lower band
' matrices, and symmetric band matrices are all
' represented by a single class: BandMatrix.
'
' Constructing band matrices
'
' Constructing band matrices is similar to
' constructing general matrices. See the
' BasicMatrices QuickStart samples for a more
' complete discussion.
' The following creates a 7x5 band matrix with
' upper bandwidth 1 and lower bandwidth 2:
Dim b1 = Matrix.CreateBanded(Of Double)(7, 5, 2, 1)
' Once the upper and lower bandwidth are set,
' it cannot be changed. Elements that are outside
' the band cannot be set.
' A second constructor lets you create upper
' or lower band matrices. The following constructs
' an 11x11 upper band matrix with unit diagonal
' and three non-zero upper diagonals.
Dim b2 = Matrix.CreateUpperBanded(Of Double)(11, 11, 3, MatrixDiagonal.UnitDiagonal)
' To create a symmetric band matrix, you only need
' the size and the bandwidth. The following creates
' a 6x6 symmetric tri-diagonal matrix:
Dim b3 = Matrix.CreateSymmetricBanded(Of Double)(7, 1)
' We can assign values to the components by using
' the GetDiagonal method.
b3.GetDiagonal(0).SetValue(2)
b3.GetDiagonal(1).SetValue(-1)
' Extracting band matrices
' Another way to construct a band matrix is by
' extracting them from an existing matrix.
Dim m = Matrix.CreateFromArray(3, 4, New Double() _
{
1, 2, 3,
2, 3, 4,
3, 4, 5,
4, 5, 7
}, MatrixElementOrder.ColumnMajor)
' To get the lower band part of m with bandwidth 2:
Dim b4 = BandMatrix(Of Double).Extract(m, 2, 0)
'
' BandMatrix properties
'
' A number of properties are available to determine
' whether a BandMatrix has a special structure:
Console.WriteLine($"b2 is upper? {b2.IsUpperTriangular}")
Console.WriteLine($"b2 is lower? {b2.IsUpperTriangular}")
Console.WriteLine($"b2 is unit diagonal? {b2.IsUnitDiagonal}")
Console.WriteLine($"b2 is symmetrical? {b2.IsSymmetrical}")
'
' BandMatrix methods
'
' You can get and set matrix elements:
b3(2, 3) = 55
Console.WriteLine("b3(2, 3) = {0:F0}", b3(2, 3))
' And the change will automatically be reflected
' in the symmetric element:
Console.WriteLine("b3(3, 2) = {0:F0}", b3(3, 2))
'
' Row and column views
'
' The GetRow and GetColumn methods are
' available.
Dim row = b2.GetRow(1)
Console.WriteLine($"row 1 of b2 = {row:F0}")
Dim column = b2.GetColumn(2, 3, 4)
Console.WriteLine("column 3 of b2 from row 4 to ")
Console.WriteLine($" row 5 = {column:F0}")
'
' Band matrix decompositions
'
' Specialized classes exist to represent the
' LU decomposition of a general band matrix
' and the Cholesky decomposition of a
' symmetric band matrix.
' Because of pivoting, the upper band matrix of
' the LU decomposition has larger bandwidth.
' You need to allocate extra space to be able to
' overwrite a matrix with its LU decomposition.
' The following creates a 7x5 band matrix with
' upper bandwidth 1 and lower bandwidth 2.
Dim b5 = Matrix.CreateBanded(Of Double)(7, 7, 2, 1, True)
b5.GetDiagonal(0).SetValue(2.0)
b5.GetDiagonal(-2).SetValue(-1.0)
b5.GetDiagonal(1).SetValue(-1.0)
' Other than that, the API is the same as
' other decomposition classes.
Dim blu As LUDecomposition(Of Double) = b5.GetLUDecomposition(True)
Dim solution = blu.Solve(Vector.CreateConstant(b5.ColumnCount, 1.0))
Console.WriteLine($"Solution of b5*x = ones: {solution:F4}")
Console.WriteLine("Press Enter key to continue.")
Console.ReadLine()
End Sub
End Module