Matrix multiplication of random variables.
x %**% y
# S3 method for rvar
matrixOps(x, y)
(multiple options) The object to be postmultiplied by y
:
If a vector is used, it is treated as a row vector.
(multiple options) The object to be premultiplied by x
:
If a vector is used, it is treated as a column vector.
An rvar
representing the matrix product of x
and y
.
If x
or y
are vectors, they are converted into matrices prior to multiplication, with x
converted to a row vector and y
to a column vector. Numerics and logicals can be multiplied
by rvar
s and are broadcasted across all draws of the rvar
argument. Tensor multiplication
is used to efficiently multiply matrices across draws, so if either x
or y
is an rvar
,
x %**% y
will be much faster than rdo(x %*% y)
.
In R >= 4.3, you can also use %*%
in place of %**%
for matrix multiplication
of rvar
s. In R < 4.3, S3 classes cannot properly override %*%
, so
you must use %**%
for matrix multiplication of rvar
s.
# d has mu (mean vector of length 3) and Sigma (3x3 covariance matrix)
d <- as_draws_rvars(example_draws("multi_normal"))
d$Sigma
#> rvar<100,4>[3,3] mean ± sd:
#> [,1] [,2] [,3]
#> [1,] 1.28 ± 0.17 0.53 ± 0.20 -0.40 ± 0.28
#> [2,] 0.53 ± 0.20 3.67 ± 0.45 -2.10 ± 0.48
#> [3,] -0.40 ± 0.28 -2.10 ± 0.48 8.12 ± 0.95
# trivial example: multiplication by a non-random matrix
d$Sigma %**% diag(1:3)
#> rvar<100,4>[3,3] mean ± sd:
#> [,1] [,2] [,3]
#> [1,] 1.28 ± 0.17 1.05 ± 0.40 -1.21 ± 0.85
#> [2,] 0.53 ± 0.20 7.33 ± 0.89 -6.30 ± 1.44
#> [3,] -0.40 ± 0.28 -4.20 ± 0.96 24.35 ± 2.84
# Decompose Sigma into R s.t. R'R = Sigma ...
R <- chol(d$Sigma)
# ... and recreate Sigma using matrix multiplication
t(R) %**% R
#> rvar<100,4>[3,3] mean ± sd:
#> [,1] [,2] [,3]
#> [1,] 1.28 ± 0.17 0.53 ± 0.20 -0.40 ± 0.28
#> [2,] 0.53 ± 0.20 3.67 ± 0.45 -2.10 ± 0.48
#> [3,] -0.40 ± 0.28 -2.10 ± 0.48 8.12 ± 0.95