# VB Matrix Example

← All NMath Code Examples

```Imports System

Imports CenterSpace.NMath.Core
Imports Range = CenterSpace.NMath.Core.Range

Namespace CenterSpace.NMath.Core.Examples.VisualBasic

' A .NET example in Visual Basic showing some of the basic functionality of the matrix classes.
Module MatrixExample

Sub Main()

Dim A As New DoubleMatrix("3x3 [1 2 3  4 5 6  7 8 9]")

' You can obtain vector "views" of the rows and columns.
Dim row1 As DoubleVector = A.Row(1)

Console.WriteLine()

' Remember, indexing starts at 0 so row one really means the second
' row of the matrix.
Console.WriteLine("Row 1 = {0}", row1.ToString())   ' [4 5 6]
Console.WriteLine()

Dim col0 As DoubleVector = A.Col(0)
Console.WriteLine("Column 0 = {0}", col0.ToString())   ' [1 4 7]
Console.WriteLine()

' Remember that these vectors are different views of the data in
' the matrix A. Changing a value in one of these vectors will change
' the corresponding value in the matrix.
row1(0) = 10
Console.WriteLine("Value of A[1,0] == 10 is {0}", A(1, 0).Equals(10))  ' True
Console.WriteLine()

' You can make sure that your data is not being shared with anyone
' else by invoking the DeepenThisCopy method. This will insure that
' you have your own private copy of the data and that it occupies
' contiguous storage.
A.DeepenThisCopy()
row1(0) = 100
Console.WriteLine("Value of A[1,0] == 100 is {0}", A(1, 0) = 100)  ' False
Console.WriteLine()

' You can also obtain vector views of the various diagonals of A.
' Here's is one way to create the 3 by 3 matrix B
'     |1  2 0|
' B = |-2 1 2|
'     |0 -2 1|
' That is, 1's on the main diagonal, 2's in the super-diagonal, and
' -2's on the sub-diagonal.
Dim B As New DoubleMatrix(3, 3)   ' A 3x3 matrix with all zeroes
B.Diagonal().Set(Range.All, 1.0)
B.Diagonal(1).Set(Range.All, 2.0)
B.Diagonal(-1).Set(Range.All, -2.0)
Console.WriteLine("B...")
Console.WriteLine(B.ToTabDelimited())   ' B = 3x3 [1 2 0  -2 1 2  0 -2 1]
Console.WriteLine()

' Sum the columns of B
Dim Totals As DoubleVector = NMathFunctions.Sum(B)
Console.WriteLine("Column totals of B = {0}", Totals.ToString())
Console.WriteLine()

' There are methods to compute matrix norms with respect to the one
' and infinity norms.
Console.WriteLine("The one-norm of A = {0}", A.InfinityNorm())
Console.WriteLine()
Console.WriteLine("The infinity-norm of A = {0}", A.OneNorm())
Console.WriteLine()

' The Resize method changes the dimensions of a matrix. Values are
' truncated or padded with zeros as appropriate.
A.Resize(5, 5)

' A will have it's original values in the top-left 3 by 3 corner.
' The last two rows and the last two columns will zeros.
Console.WriteLine("A resized...")
Console.WriteLine(A.ToTabDelimited)

' The indexers can be used to obtain vector views of slices of the
' rows or columns of A.
' Construct a Range object which starts at 0, goes to the end and has
' a stride of 2.
Dim everyOtherElt As New Range(0, Position.End, 2)

' Create a vector that views every other element of the last
' last column of A.
Dim lastColEveryOther As DoubleVector = A(everyOtherElt, A.Cols - 1)

' Use this vector to set every other element in the last column
' of A to 2.
lastColEveryOther.Set(Range.All, 2.0)
Console.WriteLine("lastColEveryOther = {0}", lastColEveryOther.ToString())   ' [1 1 1 1 1]
Console.WriteLine()

' Last column of A is [2 0 2 0 2]
Console.WriteLine("Last column of A = {0}", A.Col(A.Cols - 1).ToString())
Console.WriteLine()

' Matrix/Matrix and Matrix/Vector products are computed using the appropriate
' static methods in the NMathFunctions class.
B = New DoubleMatrix(5, 5, 1, 1)
Dim C As DoubleMatrix = NMathFunctions.Product(A, B)
Console.WriteLine("Inner product of A and B is...")
Console.WriteLine(C.ToTabDelimited)
Console.WriteLine()

Dim v As New DoubleVector("[5 4 3 2 1]")
Dim u As DoubleVector = NMathFunctions.Product(A, v)
Console.WriteLine("Inner product of A and v = ", u.ToString())
Console.WriteLine()

' Transpose products are available too.
C = NMathFunctions.TransposeProduct(A, B)
Console.WriteLine("The inner product of the transpose of A with B is...")
Console.WriteLine(C.ToTabDelimited)
Console.WriteLine()

' For complex matrices, conjugate transpose products are available.
Dim d As New DoubleComplex(1, 1)
' Construct a two matrices whose values are multiples of c and 2c
Dim F As New DoubleComplexMatrix(3, 3, d, d)
Dim G As New DoubleComplexMatrix(3, 3, d, 2 * d)
Dim H As DoubleComplexMatrix = NMathFunctions.ConjTransposeProduct(F, G)
Console.WriteLine("The inner product of the complex conjugate of F with G is...")
Console.WriteLine(NMathFunctions.Real(H).ToTabDelimited)

Console.WriteLine()
Console.WriteLine("Press Enter Key")