**17.5****
****Banded Matrices** (.NET, C#, CSharp, VB, Visual Basic, F#)

A *banded* matrix is a matrix
that has all its non-zero entries near the diagonal. Entries farther
above the diagonal than the *upper bandwidth*, or farther
below the diagonal than the *lower bandwidth*, are
defined to be zero. That is, if is the upper bandwidth, and is the lower bandwidth,
then whenever or .

For example, this is a 7 x 7 banded matrix with upper bandwidth 1 and lower bandwidth 3:

**NMath** provides
banded matrix classes for four datatypes: single- and double-precision
floating point numbers, and single- and double-precision complex numbers.
The classnames are **FloatBandMatrix**, **DoubleBandMatrix**, **FloatComplexBandMatrix**,
and **DoubleComplexBandMatrix**.

For efficiency, zero elements outside the bandwidth are not stored. Instead, matrix values are stored in a vector column by column. Blank entries are inserted in the data vector so that the each column takes up the same number of elements, , in the vector. For example, the following 8 x 8 matrix with an upper bandwidth of 2 and a lower bandwidth of 1:

is stored in a data vector as:

v = [x x a00 a10

x a01 a11 a21

a02 a12 a22 a32

a13 a23 a33 a43

a24 a34 a44 a54

a35 a45 a55 a65

a46 a56 a66 a76

a57 a67 a77 x ]

where *x* denotes
an unused location.