--- /dev/null
+function S = advection_matrix_sparse(integerN)
+ ##
+ ## Sparse version of the advection_matrix function. See
+ ## advection_matrix.m for details.
+ ##
+
+ if (integerN < 2)
+ S = NA;
+ return
+ end
+
+ ## The ones directly above the diagonal.
+ top = [ [zeros(integerN-1, 1), speye(integerN-1)]; ...
+ zeros(1, integerN)];
+
+ ## The ones directly below the diagonal.
+ bottom = [ [zeros(1, integerN-1); ...
+ -speye(integerN-1) ], zeros(integerN, 1)];
+
+ ## Combine the top and bottom.
+ S = top + bottom;
+
+ ## Fill in the entries in the corner.
+ S(1, integerN) = -1;
+ S(integerN, 1) = 1;
+
+ ## And divide the whole thing by 2.
+ S = (1/2)*S;
+end
--- /dev/null
+result = true;
+
+for n = [3:100]
+ ## Check the sparse matrix against the full one.
+ expected = advection_matrix(n,0,1);
+ actual = advection_matrix_sparse(n);
+
+ if (expected != actual)
+ result = false;
+ end
+end
+
+
+unit_test_equals("Sparse advection matrices agree with full ones", ...
+ true, ...
+ result);