12,396,961 members (56,006 online)
alternative version

104.4K views
26 bookmarked
Posted

# A VB.NET class useful for basic linear algebra

, 2 Sep 2003
 Rate this:
Some vector and matrix manipulation routines.

## Introduction

An important omission in .NET is numerical computation. There are some VB libraries out there for this purpose, but because I had already converted a few Numerical Recipes routines from C to VB4 years ago, and in order to have tight integration with my `Color` class, I decided to upgrade these old routines to VB.NET. It was only a small effort to enhance the class with some basic matrix and vector algebra routines, especially with the possibility of overloading in VB.NET.

## Background

Some knowledge about linear algebra and numerical computing comes in handy.

## Features

Just as my `Color` class, this class is not written for speed, instead I hope it is clear and easy to read, and to extend (hint). Note, however that the routines translated from 'Numerical Recipes in C' are NOT very readable and shouldn't be changed (I just know they work, don't ask me how)! There are 3 basic building blocks: a scalar (single), a vector (1 dimensional array of single) and a matrix (2 dimensional array of single). Some of the features of the class are:

• Singular value decomposition based solver, adapted from 'Numerical Recipes in C'. Can solve over-determined systems of linear equations in a least-squares sense.
• Non-linear optimization based solver, adapted from the Nelder-Mead simplex algorithm in 'Numerical recipes in C'. Can find the parameters that minimizes a user-supplied function. See `ImproveRGBTosRGBTransform` in the `Color` class for an example of how to use this function.
• Vector norm
• Element-wise addition, subtraction and scaling of vectors and matrices
• Sum and mean of elements of a vector or columns of a matrix
• Maximum and minimum of the elements of a vector or a matrix
• Transpose of a matrix
• Scalar product of a vector-matrix product
• Matrix, vector-matrix and matrix-vector product
• Extraction of sub-matrix
• Getting and settings row and columns of matrix using a vector
• File IO of matrices and vectors
• `ToString` for matrices and vectors

I realize that this is by no means a complete BLAS class, I just implemented what I needed. I just hope it is helpful to somebody, maybe as a starting class for more advanced functionality (Please let me now, so I can post enhancements back on the website)

## Code example

Here is a piece from the `Color` class that actually solves 3 sets of linear equations at once (one for each R, G and B color component), resulting in a set of equations that can be used to transform color triplets from one color space to another, e.g. for calibration purposes. Note that although the set of equations is linear with regards to the unknown coefficients, it can be highly non-linear with regards to the input R, G and B values, depending on the value of `iTransformType` which determines the type of polynome in R, G and B that will be used, e.g. the third-order polynome `R' = a1 * R + a2 * G + a3 * B + a4 * R * G + a5 * R * B + a6 * G * B + a7 * R * G * B`.

```Public Shared Sub ComputeColorSpaceTransform(ByVal sC1(,) As Single, _
ByVal sC2(,) As Single, _
ByRef sTransform(,) As Single, _
ByVal iTransformType As ColorSpaceTransform)

'Compute the polynomial transforms from R3 to R3,
'both representing LINEAR color spaces.
'This is based on a set of N color triplets in sC1, which have to
'be mapped to N color triplets in sC2.
'This means both sC1 and sC2 are N x 3 matrices.
'This also means there are actually 3 transforms to be computed,
'i.e. one for every color coordinate.
'The passed on iTransformType is equal to the number of terms
'in the transform (3 for linear,etc..),
'and can be termed the order of the transform.
'The resulting polynomial transform is stored in a 3 x M matrix,
'which can be right multiplied with
'a color N-tuple to obtain the desired color tristimulus value.

'NOTE: Usually the color transform is used to transform from RGB
'to sRGB or XYZ, allowing for device calibration

Dim iNrColors, i As Integer

iNrColors = sC1.GetUpperBound(0) + 1
Console.WriteLine("Computing " & iTransformType & _
"-term transform using " & iNrColors & " tristimulus values")

'Compute sA using the input color triplets
Dim sCNL(iTransformType - 1), sA(iNrColors - 1, _
iTransformType - 1), sC(2) As Single

For i = 0 To iNrColors - 1
Algebra.GetMatrixRow(sC1, sC, i)

' Compute higher order terms in R,G,B
ColorTripletToNTuple(sC, sCNL)

'Copy color N-tuple to sA
Algebra.SetMatrixRow(sA, sCNL, i)
Next i

Console.WriteLine("Design matrix is " & vbNewLine _
& Algebra.ToString(sA))

'Solve the 3 sets of linear equations (they are
'linear in their unknowns, even if they use
'coefficient which are non-linear functions of the
'input color triplets!)
'The resulting matrix needs to be transposed to be
'consistent with the fixed linear transform
'matrices already used in the color class
'(they all use Tf.X = Y, NOT X.Tf = Y)

Dim sX(iTransformType - 1, 2) As Single
Algebra.Solve(sA, sX, sC2)

ReDim sTransform(2, iTransformType - 1)
Algebra.Transpose(sX, sTransform)
End Sub```

## Improvements in current version

I have removed some bugs, and added the non-linear solver. The Nelder-Mead simplex algorithm is very robust and general, albeit slower than some gradient descent type algorithms. In order to be sure to find a global minimum, it can be restarted with a different starting simplex (a simplex is n + 1 dimensional figure, e.g. for a search in 2 dimensional space, a simplex would be a set of 3 2D points, i.e. a triangle, that encloses the potential solution).

## To do

The naming of some of the routines may seem bizarre to mathematicians, I need to dig into my university linear algebra courses and find the proper names for some of the operations on vectors and matrices.

A list of licenses authors might use can be found here

## Share

 Software Developer (Senior) Belgium
Physicist, Biomedical Engineer, Phd in engineering. Specific expertise is in medical photography and it's related image processing, and in colourimetry.

## You may also be interested in...

 First Prev Next
 Help me to solve this task jawaharraj896-Feb-12 23:16 jawaharraj89 6-Feb-12 23:16
 Re: Help me to solve this task yvdh6-Feb-12 23:33 yvdh 6-Feb-12 23:33
 Re: Help me to solve this task jawaharraj897-Feb-12 19:45 jawaharraj89 7-Feb-12 19:45
 Re: Help me to solve this task yvdh7-Feb-12 23:40 yvdh 7-Feb-12 23:40
 with user interface sajedxvc28-Dec-09 6:12 sajedxvc 28-Dec-09 6:12
 Re: with user interface yvdh29-Dec-09 0:37 yvdh 29-Dec-09 0:37
 help Crispis8216-Dec-07 23:25 Crispis82 16-Dec-07 23:25
 New release: the TOMNET optimization environment for .NET PER900014-Mar-07 4:20 PER9000 14-Mar-07 4:20
 Re: New release: the TOMNET optimization environment for .NET yvdh14-Mar-07 5:02 yvdh 14-Mar-07 5:02
 Project Factors Matthew Holton8-Nov-06 19:00 Matthew Holton 8-Nov-06 19:00
 Nice Work VickyC#2-May-06 15:33 VickyC# 2-May-06 15:33
 Re: Nice Work yvdh2-May-06 21:27 yvdh 2-May-06 21:27
 Re: Nice Work [modified] Peter Mortensen4-Dec-08 2:28 Peter Mortensen 4-Dec-08 2:28
 Doesn't work for me =/ rioman3-Jun-05 2:36 rioman 3-Jun-05 2:36
 Re: Doesn't work for me =/ yvdh3-Jun-05 3:50 yvdh 3-Jun-05 3:50
 Re: Doesn't work for me =/ rioman3-Jun-05 4:18 rioman 3-Jun-05 4:18
 Re: Doesn't work for me =/ yvdh3-Jun-05 5:32 yvdh 3-Jun-05 5:32
 Re: Doesn't work for me =/ rioman5-Jun-05 21:06 rioman 5-Jun-05 21:06
 Re: Doesn't work for me =/ Anonymous4-Jun-05 3:53 Anonymous 4-Jun-05 3:53
 Awesome Toni Danza24-Nov-03 15:28 Toni Danza 24-Nov-03 15:28
 An improvement dog_spawn3-Sep-03 6:30 dog_spawn 3-Sep-03 6:30
 Re: An improvement yvdh3-Sep-03 12:39 yvdh 3-Sep-03 12:39
 Re: An improvement dog_spawn5-Sep-03 12:34 dog_spawn 5-Sep-03 12:34
 Re: An improvement yvdh6-Sep-03 3:36 yvdh 6-Sep-03 3:36