R: Boolean Arithmetic Matrix Products: '%&%' and Methods

%&%-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 = "mMatrix", y = "mMatrix")`
`signature(x = "nMatrix", y = "nMatrix")`
`signature(x = "nMatrix", y = "nsparseMatrix")`
`signature(x = "nsparseMatrix", y = "nMatrix")`
`signature(x = "nsparseMatrix", y = "nsparseMatrix")`
`signature(x = "sparseVector", y = "mMatrix")`
`signature(x = "mMatrix", y = "sparseVector")`
`signature(x = "sparseVector", y = "sparseVector")`

### Note

The current implementation ends up coercing both `x` and `y` to (virtual) class `nsparseMatrix` which may be quite inefficient. A future implementation may well return a matrix with different class, but the “same” content, i.e., the same matrix entries m[i,j].

### Examples

    set.seed(7)
    L <- Matrix(rnorm(20) > 1,    4,5)
    (N <- as(L, "nMatrix"))
    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"

[Package Matrix version 1.2-12 Index]