Code covered by the BSD License

# (Block) tri-diagonal matrices

### John D'Errico (view profile)

01 Apr 2006 (Updated )

Generate (block) tridiagonal matrices

blktridiag_demo

## A 10x10 tridiagonal matrix, with 2 on the diagonal, -1 on the off diagonal.

```A = blktridiag(2,-1,-1,10);

% The sparsity pattern is correct
spy(A)

% and the elements are as designated
full(A)
```
```ans =
2    -1     0     0     0     0     0     0     0     0
-1     2    -1     0     0     0     0     0     0     0
0    -1     2    -1     0     0     0     0     0     0
0     0    -1     2    -1     0     0     0     0     0
0     0     0    -1     2    -1     0     0     0     0
0     0     0     0    -1     2    -1     0     0     0
0     0     0     0     0    -1     2    -1     0     0
0     0     0     0     0     0    -1     2    -1     0
0     0     0     0     0     0     0    -1     2    -1
0     0     0     0     0     0     0     0    -1     2
```

## A lower block bidiagonal matrix with replicated blocks

```% with 2x2 blocks of ones on the main diagonal, and
% 2x2 blocks of twos on the sub-diagonal

A = blktridiag(ones(2),2*ones(2),zeros(2),5);

spy(A)
full(A)
```
```ans =
1     1     0     0     0     0     0     0     0     0
1     1     0     0     0     0     0     0     0     0
2     2     1     1     0     0     0     0     0     0
2     2     1     1     0     0     0     0     0     0
0     0     2     2     1     1     0     0     0     0
0     0     2     2     1     1     0     0     0     0
0     0     0     0     2     2     1     1     0     0
0     0     0     0     2     2     1     1     0     0
0     0     0     0     0     0     2     2     1     1
0     0     0     0     0     0     2     2     1     1
```

## A block tridiagonal matrix with replicated blocks

```Amd = reshape(1:9,3,3);
Asub = reshape(11:19,3,3);
Asup = reshape(21:29,3,3);
A = blktridiag(Amd,Asub,Asup,4);

spy(A)
full(A)
```
```ans =
1     4     7    21    24    27     0     0     0     0     0     0
2     5     8    22    25    28     0     0     0     0     0     0
3     6     9    23    26    29     0     0     0     0     0     0
11    14    17     1     4     7    21    24    27     0     0     0
12    15    18     2     5     8    22    25    28     0     0     0
13    16    19     3     6     9    23    26    29     0     0     0
0     0     0    11    14    17     1     4     7    21    24    27
0     0     0    12    15    18     2     5     8    22    25    28
0     0     0    13    16    19     3     6     9    23    26    29
0     0     0     0     0     0    11    14    17     1     4     7
0     0     0     0     0     0    12    15    18     2     5     8
0     0     0     0     0     0    13    16    19     3     6     9
```

## A tridiagonal matrix with random elements

```Amd = rand(1,1,7);
Asub = rand(1,1,6);
Asup = rand(1,1,6);
A = blktridiag(Amd,Asub,Asup);

spy(A)
full(A)
```
```ans =
0.75469      0.50596            0            0            0            0            0
0.95974      0.27603      0.69908            0            0            0            0
0      0.34039       0.6797       0.8909            0            0            0
0            0      0.58527       0.6551      0.95929            0            0
0            0            0      0.22381      0.16261      0.54722            0
0            0            0            0      0.75127        0.119      0.13862
0            0            0            0            0       0.2551      0.49836
```

## A block tridiagonal matrix with distinct elements

```Amd = reshape(1:27,[3 3 3]);
Asub = reshape(101:118,[3 3 2]);
Asup = reshape(201:218,[3 3 2]);
A = blktridiag(Amd,Asub,Asup);

spy(A)
full(A)
```
```ans =
1     4     7   201   204   207     0     0     0
2     5     8   202   205   208     0     0     0
3     6     9   203   206   209     0     0     0
101   104   107    10    13    16   210   213   216
102   105   108    11    14    17   211   214   217
103   106   109    12    15    18   212   215   218
0     0     0   110   113   116    19    22    25
0     0     0   111   114   117    20    23    26
0     0     0   112   115   118    21    24    27
```

## A block tridiagonal matrix with 2x3 fixed non-square blocks

```Amd = rand(2,3);
Asub = 2*ones(2,3);
Asup = ones(2,3);
A = blktridiag(Amd,Asub,Asup,3);

spy(A)
full(A)
```
```ans =
Columns 1 through 7
0.14929      0.84072      0.81428            1            1            1            0
0.25751      0.25428      0.24352            1            1            1            0
2            2            2      0.14929      0.84072      0.81428            1
2            2            2      0.25751      0.25428      0.24352            1
0            0            0            2            2            2      0.14929
0            0            0            2            2            2      0.25751
Columns 8 through 9
0            0
0            0
1            1
1            1
0.84072      0.81428
0.25428      0.24352
```

## A block tridiagonal matrix with varying 3x2 non-square blocks

```Amd = reshape(1:18,[3 2 3]);
Asub = reshape(101:112,[3 2 2]);
Asup = reshape(201:212,[3 2 2]);
A = blktridiag(Amd,Asub,Asup);

spy(A)
full(A)
```
```ans =
1     4   201   204     0     0
2     5   202   205     0     0
3     6   203   206     0     0
101   104     7    10   207   210
102   105     8    11   208   211
103   106     9    12   209   212
0     0   107   110    13    16
0     0   108   111    14    17
0     0   109   112    15    18
```