Click here to Skip to main content
Click here to Skip to main content

A VB.NET class useful for basic linear algebra

, 2 Sep 2003
Rate this:
Please Sign up or sign in to vote.
Some vector and matrix manipulation routines.


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.


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


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.


This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


About the Author

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

Comments and Discussions

GeneralHelp me to solve this task Pinmemberjawaharraj897-Feb-12 0:16 
GeneralRe: Help me to solve this task Pinmemberyvdh7-Feb-12 0:33 
GeneralRe: Help me to solve this task Pinmemberjawaharraj897-Feb-12 20:45 
GeneralRe: Help me to solve this task Pinmemberyvdh8-Feb-12 0:40 
Generalwith user interface Pinmembersajedxvc28-Dec-09 7:12 
GeneralRe: with user interface Pinmemberyvdh29-Dec-09 1:37 
Questionhelp PinmemberCrispis8217-Dec-07 0:25 
GeneralNew release: the TOMNET optimization environment for .NET PinmemberPER900014-Mar-07 5:20 
GeneralRe: New release: the TOMNET optimization environment for .NET Pinmemberyvdh14-Mar-07 6:02 
GeneralProject Factors PinmemberMatthew Holton8-Nov-06 20:00 
GeneralNice Work PinmemberVickyC#2-May-06 16:33 
GeneralRe: Nice Work Pinmemberyvdh2-May-06 22:27 
GeneralRe: Nice Work [modified] PinmemberPeter Mortensen4-Dec-08 3:28 
GeneralDoesn't work for me =/ Pinmemberrioman3-Jun-05 3:36 
GeneralRe: Doesn't work for me =/ Pinmemberyvdh3-Jun-05 4:50 
GeneralRe: Doesn't work for me =/ Pinmemberrioman3-Jun-05 5:18 
GeneralRe: Doesn't work for me =/ Pinmemberyvdh3-Jun-05 6:32 
GeneralRe: Doesn't work for me =/ Pinmemberrioman5-Jun-05 22:06 
GeneralRe: Doesn't work for me =/ PinsussAnonymous4-Jun-05 4:53 
GeneralAwesome PinsussToni Danza24-Nov-03 16:28 
GeneralAn improvement Pinmemberdog_spawn3-Sep-03 7:30 
GeneralRe: An improvement Pinmemberyvdh3-Sep-03 13:39 
GeneralRe: An improvement Pinmemberdog_spawn5-Sep-03 13:34 
GeneralRe: An improvement Pinmemberyvdh6-Sep-03 4:36 
Generalmissing download link Pinmembervalko17-Jul-03 7:19 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Terms of Use | Mobile
Web02 | 2.8.150414.1 | Last Updated 3 Sep 2003
Article Copyright 2003 by yvdh
Everything else Copyright © CodeProject, 1999-2015
Layout: fixed | fluid