1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
|
\name{SparseArray-Arith-methods}
\alias{SparseArray-Arith-methods}
\alias{SparseArray_Arith-methods}
\alias{SparseArray-Arith}
\alias{SparseArray_Arith}
\alias{SparseArray-arith-methods}
\alias{SparseArray_arith-methods}
\alias{SparseArray-arith}
\alias{SparseArray_arith}
\alias{+,SparseArray,missing-method}
\alias{-,SparseArray,missing-method}
\alias{Arith,SVT_SparseArray,vector-method}
\alias{Arith,vector,SVT_SparseArray-method}
\alias{Arith,SVT_SparseArray,SVT_SparseArray-method}
\alias{Arith,SVT_SparseArray,array-method}
\alias{Arith,array,SVT_SparseArray-method}
\title{'Arith' operations on SparseArray objects}
\description{
\link{SparseArray} derivatives support operations from the \code{Arith}
group, with some restrictions.
See \code{?\link[methods]{S4groupGeneric}} in the \pkg{methods} package
for more information about the \code{Arith} group generic.
IMPORTANT NOTES:
\itemize{
\item Only \link{SVT_SparseArray} objects are supported at the moment.
Support for \link{COO_SparseArray} objects might be added in the
future.
\item \link{SVT_SparseArray} of \code{type()} \code{"complex"} don't
support \code{Arith} operations at the moment.
}
}
\details{
Two forms of 'Arith' operations are supported:
\enumerate{
\item Between an \link{SVT_SparseArray} object \code{svt} and a single
value \code{y}: \preformatted{ svt op y
y op svt}
The \code{Arith} operations that support this form are: \code{*},
\code{/}, \code{^}, \code{\%\%},\code{\%/\%}.
Note that, except for \code{*} (for which both \code{svt * y}
and \code{y * svt} are supported), single value \code{y} must
be on the right e.g. \code{svt ^ 3}.
\item Between two \link{SVT_SparseArray} objects \code{svt1} and
\code{svt2} of same dimensions (a.k.a. \emph{conformable arrays}):
\preformatted{ svt1 op svt2}
The \code{Arith} operations that support this form are: \code{+},
\code{-}, \code{*}.
}
}
\value{
A \link{SparseArray} derivative of the same dimensions as the input
object(s).
}
\seealso{
\itemize{
\item \code{\link[methods]{S4groupGeneric}} in the \pkg{methods} package.
\item \link{SparseArray} objects.
\item Ordinary \link[base]{array} objects in base R.
}
}
\examples{
## ---------------------------------------------------------------------
## Basic examples
## ---------------------------------------------------------------------
svt1 <- SVT_SparseArray(dim=c(15, 6), type="integer")
svt1[cbind(1:15, 2)] <- 100:114
svt1[cbind(1:15, 5)] <- -(114:100)
svt1
svt1 * -0.01
svt1 * 10 # result is of type "double"
svt1 * 10L # result is of type "integer"
svt1 / 10L
svt1 ^ 3.5
svt1 \%\% 5L
svt1 \%/\% 5L
svt2 <- SVT_SparseArray(dim=dim(svt1), type="double")
svt2[c(2, 6, 12:17, 22:33, 55, 59:62, 90)] <- runif(26)
svt2
svt1 + svt2
svt1 - svt2
svt1 * svt2
svt2 * (0.1 * svt1 - svt2 ^ 2) + svt1 / sum(svt2)
## Sanity checks:
m1 <- as.matrix(svt1)
m2 <- as.matrix(svt2)
stopifnot(
identical(as.matrix(svt1 * -0.01), m1 * -0.01),
identical(as.matrix(svt1 * 10), m1 * 10),
identical(as.matrix(svt1 * 10L), m1 * 10L),
identical(as.matrix(svt1 / 10L), m1 / 10L),
identical(as.matrix(svt1 ^ 3.5), m1 ^ 3.5),
identical(as.matrix(svt1 \%\% 5L), m1 \%\% 5L),
identical(as.matrix(svt1 \%/\% 5L), m1 \%/\% 5L),
identical(as.matrix(svt1 + svt2), m1 + m2),
identical(as.matrix(svt1 - svt2), m1 - m2),
identical(as.matrix(svt1 * svt2), m1 * m2),
all.equal(as.matrix(svt2 * (0.1 * svt1 - svt2 ^ 2) + svt1 / sum(svt2)),
m2 * (0.1 * m1 - m2 ^ 2) + m1 / sum(m2))
)
## ---------------------------------------------------------------------
## An example combining operations from the 'Arith', 'Compare',
## and 'Logic' groups
## ---------------------------------------------------------------------
m3 <- matrix(0L, nrow=15, ncol=6)
m3[c(2, 6, 12:17, 22:33, 55, 59:62, 90)] <- 101:126
svt3 <- SparseArray(m3)
## Can be 5x or 10x faster than with a dgCMatrix object on a big
## SVT_SparseMatrix object!
svt4 <- (svt3^1.5 + svt3) \%\% 100 - 0.2 * svt3 > 0
svt4
## Sanity check:
m4 <- (m3^1.5 + m3) \%\% 100 - 0.2 * m3 > 0
stopifnot(identical(as.matrix(svt4), m4))
}
\keyword{array}
\keyword{methods}
\keyword{algebra}
\keyword{arith}
|