Accessing Matrix Elements in Visual Basic QuickStart Sample

Illustrates different ways of iterating through the rows and columns of a matrix using classes in the Numerics.NET.LinearAlgebra namespace in Visual Basic.

View this sample in: C# F# IronPython

Option Infer On

Imports Numerics.NET
' Matrix and Vector classes reside in the
' Numerics.NET.LinearAlgebra namespace.
Imports Numerics.NET.LinearAlgebra

' Illustrates accessing matrix components and iterating 
' through the rows and columns of a matrix. Matrix classes
' reside in the Numerics.NET.LinearAlgebra namespace 
' of Numerics.NET.
Module AccessingMatrixComponents

    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")

        ' We'll work with this matrix:
        Dim m = Matrix.CreateFromArray(2, 3, New Double() {1, 2, 3, 4, 5, 6},
            MatrixElementOrder.ColumnMajor)

        '
        ' Individual components
        '

        ' The Matrix class has an indexer property that takes two arguments:
        ' the row and column index. Both are zero based.
        Console.WriteLine("m(1,1) = {0:F4}", m(1, 1))

        '
        ' Rows and columns
        '

        ' Indexed range access

        ' The indexer property is overloaded to allow for direct indexed access 
        ' to complete or partial rows or columns.

        Dim row1 = m(0, New Range(1, 2))
        ' This prints "(3, 5)":
        Console.WriteLine($"row1 = {row1:F4}")

        ' The special range Range.All lets you access an entire row
        ' or column without having to specify any details about the range.
        Dim row2 = m(1, Range.All)
        ' This prints "(2, 4, 6)":
        Console.WriteLine($"row1 = {row2:F4}")
        Dim column1 = m(Range.All, 0)
        ' This prints "(1, 2)":
        Console.WriteLine($"column1 = {column1:F4}")

        ' We can assign to rows and columns, too:
        m(Range.All, 0) = row1
        ' This prints "((3, 3, 5) (5, 4, 6)"
        Console.WriteLine($"m = {m:F4}")

        ' GetRow and GetColumn provide an alternate mechanism 
        ' for achieving the same result.

        ' Passing just one parameter retrieves the specified row or column:
        row1 = m.GetRow(1)
        ' This prints "(2, 4, 6)":
        Console.WriteLine($"row1 = {row1:F4}")
        column1 = m.GetColumn(0)
        ' This prints "(1, 2)":
        Console.WriteLine($"column1 = {column1:F4}")

        ' You can also pass a start and end index:
        row2 = m.GetRow(0, 1, 2)
        ' This prints "(3, 5)":
        Console.WriteLine($"row2 = {row2:F4}")

        ' We can assign to rows and columns, too, using CopyTo:
        row2.CopyTo(m.GetColumn(0))
        ' This prints "((3, 3, 5) (5, 4, 6)"
        Console.WriteLine($"m = {m:F4}")

        ' Enumeration

        ' The Rows and Columns methods allow you to enumerate over 
        ' the rows and columns of a matrix.

        ' For example: this calculates the sum of the absolute values
        ' of the components of the matrix m:
        Dim sum As Double = 0
        Dim column As Vector(Of Double)
        For Each column In m.Columns
            sum += column.OneNorm()
        Next

        '
        ' Accessing diagonals
        '

        ' Diagonals are retrieved using the GetDiagonal method:
        Dim mainDiagonal = m.GetDiagonal()
        ' An optional parameter specifies which diagonal:
        '   n < 0 means subdiagonal
        '   n > 0 means nth superdiagonal:
        Dim superDiagonal = m.GetDiagonal(1)

        '
        ' Accessing submatrices
        '

        ' Indexed range access

        ' A fourth overload of the indexer property lets you 
        ' extract a part of a matrix. Both parameters are Range 
        ' structures:
        Dim a = Matrix.Create(Of Double)(10, 10)
        ' Extract the 2nd to the 5th row of m:
        Dim a1 = a(New Range(1, 4), Range.All)
        ' Extract the odd columns:
        Dim a2 = a(Range.All, New Range(1, 9, 2))
        ' Extract the 4x4 leading submatrix of m:
        Dim a3 = a(New Range(0, 3), New Range(0, 3))

        ' You can also assign to submatrices:
        Dim identity5 = DenseMatrix(Of Double).GetIdentity(5)
        a(New Range(0, 4), New Range(5, 9)) = identity5
        a(New Range(5, 9), New Range(0, 4)) = identity5

        ' The same results can be achieved with the GetSubmatrix method.

        ' Extract the 2nd to the 5th row of m. 
        ' Start and end columns are supplied manually.
        Dim a4 = a.GetSubmatrix(1, 4, 0, 9)
        ' Extract the odd columns:
        ' Here we need to supply the transpose parameter.
        Dim a5 = a.GetSubmatrix(0, 9, 1, 1, 9, 2,
             TransposeOperation.None)
        ' Extract the 4x4 leading submatrix of m.
        ' And let's get its transpose, just because we can.
        ' We need to specify the row and column stride:
        Dim a6 = a.GetSubmatrix(0, 3, 1, 0, 3, 1,
                TransposeOperation.Transpose)

        ' You can still assign to submatrices, using the
        ' CopyTo method:
        identity5.CopyTo(a.GetSubmatrix(0, 4, 5, 9))
        identity5.CopyTo(a.GetSubmatrix(5, 9, 0, 4))

        Console.WriteLine("Press Enter key to continue.")
        Console.ReadLine()
    End Sub

End Module