# Matrix and vector `Sym` objects

#### Mikkel Meyer Andersen and Søren Højsgaard

#### 2019-02-08

    library(Ryacas)

# Matrices

Define a character matrix (covariance matrix from a certain \(AR(1)\)):

    N <- 3
    L1 <- diag(1, 1 + N)
    L1[cbind(1+(1:N), 1:N)] <- "-alpha"
    L1s <- as.Sym(L1)
    L1s

    ## Yacas matrix:
    ##      [,1]   [,2]   [,3]   [,4]
    ## [1,] 1      0      0      0
    ## [2,] -alpha 1      0      0
    ## [3,] 0      -alpha 1      0
    ## [4,] 0      0      -alpha 1

Now, this can be converted to a `Sym` object:

    L1s <- as.Sym(L1)
    L1s

    ## Yacas matrix:
    ##      [,1]   [,2]   [,3]   [,4]
    ## [1,] 1      0      0      0
    ## [2,] -alpha 1      0      0
    ## [3,] 0      -alpha 1      0
    ## [4,] 0      0      -alpha 1

Operations can be performed:

    L1s + 4

    ## Yacas matrix:
    ##      [,1]      [,2]      [,3]      [,4]
    ## [1,] 5         4         4         4
    ## [2,] 4 - alpha 5         4         4
    ## [3,] 4         4 - alpha 5         4
    ## [4,] 4         4         4 - alpha 5

    tmp <- L1s^4
    tmp

    ## Yacas matrix:
    ##      [,1]                               [,2]
    ## [1,] 1                                  0
    ## [2,] -4 * alpha                         1
    ## [3,] 3 * alpha^2 - -3 * alpha^2         -4 * alpha
    ## [4,] -(alpha^3 + alpha * (3 * alpha^2)) 3 * alpha^2 - -3 * alpha^2
    ##      [,3]       [,4]
    ## [1,] 0          0
    ## [2,] 0          0
    ## [3,] 1          0
    ## [4,] -4 * alpha 1

    Simplify(tmp)

    ## Yacas matrix:
    ##      [,1]         [,2]        [,3]       [,4]
    ## [1,] 1            0           0          0
    ## [2,] -4 * alpha   1           0          0
    ## [3,] 6 * alpha^2  -4 * alpha  1          0
    ## [4,] -4 * alpha^3 6 * alpha^2 -4 * alpha 1

Or the concentration matrix \(K=L L'\) can be found:

    K1s <- Simplify(L1s * Transpose(L1s))
    K1s

    ## Yacas matrix:
    ##      [,1]   [,2]        [,3]        [,4]
    ## [1,] 1      -alpha      0           0
    ## [2,] -alpha alpha^2 + 1 -alpha      0
    ## [3,] 0      -alpha      alpha^2 + 1 -alpha
    ## [4,] 0      0           -alpha      alpha^2 + 1

This can be converted to \(\LaTeX\):

    TeXForm(K1s)

    ## [1] "\\left( \\begin{array}{cccc} 1 &  - \\alpha  & 0 & 0 \\\\  - \\alpha  & \\alpha  ^{2} + 1 &  - \\alpha  & 0 \\\\ 0 &  - \\alpha  & \\alpha  ^{2} + 1 &  - \\alpha  \\\\ 0 & 0 &  - \\alpha  & \\alpha  ^{2} + 1 \\end{array} \\right)"

Which look like this:

    cat("\\[ K_1 = ", TeXForm(K1s), " \\]", sep = "")

\[ K_1 = \left( \begin{array}{cccc} 1 & - \alpha & 0 & 0 \\ - \alpha & \alpha ^{2} + 1 & - \alpha & 0 \\ 0 & - \alpha & \alpha ^{2} + 1 & - \alpha \\ 0 & 0 & - \alpha & \alpha ^{2} + 1 \end{array} \right) \]

# Vectors

Similar can be done for vectors:

    x <- paste0("x", 1:2)
    xs <- as.Sym(x)
    xs

    ## Yacas vector:
    ## [1] x1 x2

And matrix-vector multiplication (or matrix-matrix multiplication):

    A <- matrix(paste0(paste0("a", 1:2), rep(1:2, each = 2)), 2, 2)
    As <- as.Sym(A)
    As

    ## Yacas matrix:
    ##      [,1] [,2]
    ## [1,] a11  a12
    ## [2,] a21  a22

    As*xs

    ## Yacas vector:
    ## [1] a11 * x1 + a12 * x2 a21 * x1 + a22 * x2

    As*As

    ## Yacas matrix:
    ##      [,1]                  [,2]
    ## [1,] a11^2 + a12 * a21     a11 * a12 + a12 * a22
    ## [2,] a21 * a11 + a22 * a21 a21 * a12 + a22^2

# Eval

    xs

    ## Yacas vector:
    ## [1] x1 x2

    Eval(xs, list(x1 = 2, x2 = 3))

    ## [1] 2 3

    As

    ## Yacas matrix:
    ##      [,1] [,2]
    ## [1,] a11  a12
    ## [2,] a21  a22

    Eval(As, list(a11 = 11, a12 = 12, a21 = 21, a22 = 22))

    ##      [,1] [,2]
    ## [1,]   11   12
    ## [2,]   21   22

# Disabling functionality

The functionality can be disabled as follows:

    Ryacas_options("module_matvec_enabled")

    ## [1] TRUE

    As

    ## Yacas matrix:
    ##      [,1] [,2]
    ## [1,] a11  a12
    ## [2,] a21  a22

    Ryacas_options(module_matvec_enabled = FALSE)
    As

    ## expression(list(list(a11, a12), list(a21, a22)))