\HeaderA{drop0}{Drop "Explicit Zeroes" from a Sparse Matrix}{drop0}
\keyword{utilities}{drop0}
\keyword{array}{drop0}
\begin{Description}\relax
Returns a sparse matrix with no \dQuote{explicit zeroes}, i.e., all
zero or \code{FALSE} entries are dropped from the explicitly indexed
matrix entries.
\end{Description}
\begin{Usage}
\begin{verbatim}
drop0(x, tol = 0, is.Csparse = NA)
\end{verbatim}
\end{Usage}
\begin{Arguments}
\begin{ldescription}
\item[\code{x}] a Matrix, typically sparse, i.e., inheriting from
\code{\LinkA{sparseMatrix}{sparseMatrix.Rdash.class}}.
\item[\code{tol}] non-negative number to be used as tolerance for checking if
an entry \eqn{x_{i,j}}{} should be considered to be zero.
\item[\code{is.Csparse}] logical indicating prior knowledge about the
\dQuote{Csparseness} of \code{x}.  This exists for possible speedup
reasons only.
\end{ldescription}
\end{Arguments}
\begin{Value}
a Matrix like \code{x} but with no explicit zeros, i.e.,
\code{!any(x@x == 0)}, always inheriting from
\code{\LinkA{CsparseMatrix}{CsparseMatrix.Rdash.class}}.
\end{Value}
\begin{Note}\relax
When a sparse matrix is the result of matrix multiplications, you
may want to consider combining \code{drop0()} with
\code{\LinkA{zapsmall}{zapsmall}()},
see the example.
\end{Note}
\begin{SeeAlso}\relax
\code{\LinkA{spMatrix}{spMatrix}}, class \code{\LinkA{sparseMatrix}{sparseMatrix.Rdash.class}}
\end{SeeAlso}
\begin{Examples}
\begin{ExampleCode}
m <- spMatrix(10,20, i= 1:8, j=2:9,
              x = c(0:2,3:-1))
m
drop0(m)

## A larger example:
t5 <- new("dtCMatrix", Dim = c(5L, 5L), uplo = "L",
          x = c(10, 1, 3, 10, 1, 10, 1, 10, 10),
          i = c(0L,2L,4L, 1L, 3L,2L,4L, 3L, 4L),
          p = c(0L, 3L, 5L, 7:9))
TT <- kronecker(t5, kronecker(kronecker(t5,t5), t5))
IT <- solve(TT)
I. <- TT %*% IT ;  nnzero(I.) # 697 ( = 625 + 72 )
I.0 <- drop0(zapsmall(I.))
stopifnot(all(I.0 == Diagonal(625)))
\end{ExampleCode}
\end{Examples}

