--- /dev/null
+function envelope = envelope(A)
+ ## Compute the envelope of the matrix ``A``. The envelope of a matrix
+ ## is defined as the set of indices,
+ ##
+ ## E = { (i,j) : i < j, A(k,j) != 0 for some k <= i }
+ ##
+ if (!issymmetric(A) && !is_upper_triangular(A))
+ ## The envelope of a matrix is only defined for U-T or symmetric
+ ## matrices.
+ envelope = {NA};
+ return;
+ end
+
+ ## Start with an empty result, and append to it as we find
+ ## satisfactory indices.
+ envelope = {};
+
+ for j = [ 1 : columns(A) ]
+ ## Everything below the first non-zero element in a column will be
+ ## part of the envelope. Since we're moving from top to bottom, we
+ ## can simply set a flag indicating that we've found the first
+ ## non-zero element. Thereafter, everything we encounter should be
+ ## added to the envelope.
+ found_nonzero = false;
+
+ for i = [ 1 : j-1 ]
+ if (A(i,j) != 0)
+ found_nonzero = true;
+ end
+
+ if (found_nonzero)
+ envelope{end+1} = [i,j];
+ end
+ end
+
+ end
+
+end
--- /dev/null
+A = [2, 1, 1, 0; ...
+ 1, 2, 0, 1; ...
+ 1, 0, 2, 0; ...
+ 0, 1, 0, 1];
+
+expected = { [1,2], [1,3], [2,3], [2,4], [3,4] };
+actual = envelope(A);
+
+unit_test_equals("envelope works on an example", ...
+ true, ...
+ isequal(actual, expected));