# Sparse Matrices

This M-file considers full and sparse matrices It looks at their construction, manipulation and visualization.

A sparse matrix is a matrix where the majority of the entries are zero, in Matlab a special type of matrix is used which "squeezes" out the zero entries (it saves memory).

This is a random matrix:

```N=5;
M=rand(N);
M2=M*M; % This is its matrix square.
Mp2=M.*M; % This is its point-wise square.
```

This is an identity matrix and a sparse identity matrix:

```myI=eye(N)
myspI=speye(N)
```
```myI =

1     0     0     0     0
0     1     0     0     0
0     0     1     0     0
0     0     0     1     0
0     0     0     0     1

myspI =

(1,1)        1
(2,2)        1
(3,3)        1
(4,4)        1
(5,5)        1

```

I can check if a matrix is sparse like this:

```issparse(myI)
issparse(myspI)
```
```ans =

logical

0

ans =

logical

1

```

I can force a matrix to be sparse:

```mysamp=3*myI; mysamp(2,3)=-2;
mysamp=sparse(mysamp);
```

This looks dumb but can be quite effective especially if we want to use the sparse matrix many times later.

This is an example of a sparse matrix build in action. It builds a second order differentiation matrix.

Define a spatial grid:

```xmin = 0;
xmax = 50;
N = 2^7;
x = linspace(xmin,xmax,N+1);
dx=x(2)-x(1); dx2=dx*dx;
```

Now build a vector of ones,

```e=ones(N+1,1);
```

Next use spdiags to drop the correct vectors into the correct diagonals.

```Dxx = spdiags([e -2*e e], -1:1, N+1, N+1);
% finally scale
Dxx=(1/dx2)*Dxx;
```

This is how you visualize a matrix structure. Filled entries are in blue while empty ones are white.

```figure(1)
clf
spy(Dxx);
``` Sparsity can be very helpful when carrying out matrix solves since it offers immense speed up especially for very large matrices.

```Dxxf=full(Dxx); % This converts Dxx to a full matrix.
myrhs=sin(8*pi*x/(xmax-xmin))';
tic,mysols=Dxx\myrhs; toc
tic,mysolsf=Dxxf\myrhs; toc
max(abs(mysols-mysolsf))
```
```Elapsed time is 0.000244 seconds.
Elapsed time is 0.028909 seconds.

ans =

3.6027e-14

```