Data Analysis Mathematics Linear Algebra Statistics
New Version 8.1!

Supports .NET 6.0. Try it for free with our fully functional 60-day trial version. QuickStart Samples

# Band Matrices QuickStart Sample (Visual Basic)

Illustrates how to work with the BandMatrix class in Visual Basic.

```Option Infer On

Imports Extreme.Mathematics
' The BandMatrix class resides in the Extreme.Mathematics.LinearAlgebra
' namespace.
Imports Extreme.Mathematics.LinearAlgebra

Namespace Extreme.Numerics.QuickStart.VB
Module BandMatrices

' Illustrates the use of the BandMatrix class in the
' Extreme.Mathematics.LinearAlgebra namespace of the Extreme Optimization
' Numerical Libraries for .NET.
Sub Main()
' 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.Create(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? {0}", b2.IsUpperTriangular)
Console.WriteLine("b2 is lower? {0}", b2.IsUpperTriangular)
Console.WriteLine("b2 is unit diagonal? {0}", b2.IsUnitDiagonal)
Console.WriteLine("b2 is symmetrical? {0}", 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 = {0:F0}", row)
Dim column = b2.GetColumn(2, 3, 4)
Console.WriteLine("column 3 of b2 from row 4 to ")
Console.WriteLine("  row 5 = {0:F0}", column)

'
' 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: {0:F4}", solution)

Console.WriteLine("Press Enter key to continue.")