# VB Matrix Example

← All NMath Code Examples

```Imports System

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

Namespace CenterSpace.NMath.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.
Heres is one way to create the 3 by 3 matrix B
|1  2 0|
B = |-2 1 2|
|0 -2 1|
That is, 1s on the main diagonal, 2s in the super-diagonal, and
-2s 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 its 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")