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

# Indexes and Labels QuickStart Sample (Visual Basic)

Illustrates how to use indexes to label the rows and columns of a data frame or matrix, or the elements of a vector in Visual Basic.

```Option Infer On

Imports Extreme.DataAnalysis
Imports Extreme.Mathematics

Namespace Extreme.Numerics.QuickStart.VB
' Illustrates how to use indexes to label the elements
' of a vector, or the rows and columns of a matrix.
Module IndexesAndLabels

Sub Main()
'
' Indexes
'

' An index Is a set of keys that can be used
' to label one Or more dimensions of a vector,
' matrix, Or data frame.

'
' Construction
'

' The simplest way to create an index Is from an array
Dim index1 = Index.Create({"a", "b", "c", "d"})
' We can then assign this to the Index property of a vector
Dim v = Vector.Create({1.0, 2.0, 3.0, 4.0})
v.Index = index1
Console.WriteLine(v)

' An index by position Is very common,
' And can be created efficiently using the
' Default method
Dim numbers = Index.Default(10) ' 0, 1, ..., 9
Dim numbers2 = Index.Default(10, 20) ' 10, 11, ..., 19

' Various options exist to create indexes over date ranges,
' for example
Dim dateIndex = Index.CreateDateRange(New DateTime(2015, 4, 25), 10)
' 2015/4/25, 2015/4/26, ..., 2015/5/4

' Finally, for some purposes it may be useful to create
' an index of intervals, for example when you want to
' categorize people into age groups
Dim ages = {0, 18, 35, 65}
Dim ageGroups = Index.CreateBins(ages, SpecialBins.AboveMaximum)

'
' Properties
'

' Indexes have a length
Console.WriteLine("# of keys in index: {0}", index1.Length)
' Indexes usually have unique elements.
Console.WriteLine("Keys are unique? {0}", index1.IsUnique)
' The elements may be sorted Or Not.
Console.WriteLine("Keys are sorted? {0}", index1.IsSorted)
Console.WriteLine("Sort order: {0}", index1.SortOrder)

'
' Lookup
'

' Once created, you can look up the position of a key
Dim position = index1.Lookup("c") '= 2
If index1.TryLookup("e", position) Then
Console.WriteLine("We shouldn't be here.")
End If

' You can also look up the nearest date.
Dim rightNow = DateTime.Now
' An exact lookup fails in this case
If Not dates.TryLookup(rightNow, position) Then
Console.WriteLine("Exact lookup failed.")
End If
' But looking for the nearest key works fine
position = dates.LookupNearest(rightNow, Direction.Backward) '= 5
position = dates.LookupNearest(rightNow, Direction.Forward) '= 6

'
' Automatic alignment
'

' One of the useful features of indexes Is that
' values are aligned on key values automatically.
' For example, given two vectors
Dim a = Vector.Create(
{1.0, 2.0, 3.0, 4.0},
{"a", "b", "c", "d"})
Dim b = Vector.Create(
{10.0, 30.0, 40.0, 50.0},
{"a", "c", "d", "e"})
' We can compute their sum
Console.WriteLine(a + b)
' And we find that elements are added
' when they have the same key,
' Not when they have the same position.

' Indexes also propagate through calculations
Console.WriteLine("Exp(a) = " + Environment.NewLine + "{0}", Vector.Exp(a))
Console.WriteLine("a[a mod 2 = 0] =" + Environment.NewLine + "{0}", a(Function(x) x Mod 2 = 0))

' Matrices can have a row and/or a column index
Dim c = Matrix.CreateRandom(100, 4)
c.ColumnIndex = Index.Create({"a", "b", "c", "d"})
Dim cTc = c.Transpose() * c
Console.WriteLine("C^T*C = " + Environment.NewLine + "{0}", cTc.Summarize())

Console.Write("Press any key to exit.")