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
