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