boolmatmult-methods {Matrix} | R Documentation |
Boolean Arithmetic Matrix Products: %&%
and Methods
Description
For boolean or “pattern” matrices, i.e., R objects of
class nMatrix
, it is natural to allow matrix
products using boolean instead of numerical arithmetic.
In package Matrix, we use the binary operator %&%
(aka
“infix”) function) for this and provide methods for all our
matrices and the traditional R matrices (see matrix
).
Value
a pattern matrix, i.e., inheriting from "nMatrix"
,
or an "ldiMatrix"
in case of a diagonal matrix.
Methods
We provide methods for both the “traditional” (R base) matrices
and numeric vectors and conceptually all matrices and
sparseVector
s in package Matrix.
signature(x = "ANY", y = "ANY")
signature(x = "ANY", y = "Matrix")
signature(x = "Matrix", y = "ANY")
signature(x = "nMatrix", y = "nMatrix")
signature(x = "nMatrix", y = "nsparseMatrix")
signature(x = "nsparseMatrix", y = "nMatrix")
signature(x = "nsparseMatrix", y = "nsparseMatrix")
signature(x = "sparseVector", y = "sparseVector")
Note
These boolean arithmetic matrix products had been newly introduced for Matrix 1.2.0 (March 2015). Its implementation has still not been tested extensively.
Originally, it was left unspecified how non-structural zeros, i.e., 0
's
as part of the M@x
slot should be treated for numeric
("dMatrix"
) and logical ("lMatrix"
)
sparse matrices. We now specify that boolean matrix products should behave as if
applied to drop0(M)
, i.e., as if dropping such zeros from
the matrix before using it.
Equivalently, for all matrices M
, boolean arithmetic should work as if
applied to M != 0
(or M != FALSE
).
The current implementation ends up coercing both x
and y
to
(virtual) class nsparseMatrix
which may be quite inefficient
for dense matrices. A future implementation may well return a matrix
with different class, but the “same” content, i.e., the
same matrix entries m_ij
.
See Also
%*%
, crossprod()
, or tcrossprod()
,
for (regular) matrix product methods.
Examples
set.seed(7)
L <- Matrix(rnorm(20) > 1, 4,5)
(N <- as(L, "nMatrix"))
L. <- L; L.[1:2,1] <- TRUE; L.@x[1:2] <- FALSE; L. # has "zeros" to drop0()
D <- Matrix(round(rnorm(30)), 5,6) # -> values in -1:1 (for this seed)
L %&% D
stopifnot(identical(L %&% D, N %&% D),
all(L %&% D == as((L %*% abs(D)) > 0, "sparseMatrix")))
## cross products , possibly with boolArith = TRUE :
crossprod(N) # -> sparse patter'n' (TRUE/FALSE : boolean arithmetic)
crossprod(N +0) # -> numeric Matrix (with same "pattern")
stopifnot(all(crossprod(N) == t(N) %&% N),
identical(crossprod(N), crossprod(N +0, boolArith=TRUE)),
identical(crossprod(L), crossprod(N , boolArith=FALSE)))
crossprod(D, boolArith = TRUE) # pattern: "nsCMatrix"
crossprod(L, boolArith = TRUE) # ditto
crossprod(L, boolArith = FALSE) # numeric: "dsCMatrix"