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