# boolean-matprod: Boolean Arithmetic Matrix Products: '%&%' and Methods In Matrix: Sparse and Dense Matrix Classes 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

 ``` 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17``` ```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" ```

### Example output

```4 x 5 sparse Matrix of class "ngCMatrix"

[1,] | . . | .
[2,] . . | . .
[3,] . . . | .
[4,] . . | . .
4 x 6 sparse Matrix of class "ngCMatrix"

[1,] | | | | | .
[2,] | | . | . |
[3,] | | . . | .
[4,] | | . | . |
5 x 5 sparse Matrix of class "nsCMatrix"

[1,] | . . | .
[2,] . . . . .
[3,] . . | . .
[4,] | . . | .
[5,] . . . . .
5 x 5 sparse Matrix of class "dsCMatrix"

[1,] 1 . . 1 .
[2,] . . . . .
[3,] . . 2 . .
[4,] 1 . . 2 .
[5,] . . . . .
6 x 6 sparse Matrix of class "nsCMatrix"

[1,] | | | | | |
[2,] | | | | | |
[3,] | | | | | |
[4,] | | | | | |
[5,] | | | | | |
[6,] | | | | | |
5 x 5 sparse Matrix of class "nsCMatrix"

[1,] | . . | .
[2,] . . . . .
[3,] . . | . .
[4,] | . . | .
[5,] . . . . .
5 x 5 sparse Matrix of class "dsCMatrix"

[1,] 1 . . 1 .
[2,] . . . . .
[3,] . . 2 . .
[4,] 1 . . 2 .
[5,] . . . . .
```

Matrix documentation built on June 11, 2021, 3 p.m.