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