Skip to contents

These operators and functions provide for LaTeX representations of symbolic and numeric matrix arithmetic and computations. They provide reasonable means to compose meaningful matrix equations in LaTeX far easier than doing this manually matrix by matrix.

The following operators and functions are documented here:

  • matsum() and +, matrix addition;

  • matdiff() and -, matrix subtraction and negation;

  • *, product of a scalar and a matrix;

  • Dot(), inner product of two vectors;

  • matprod() and %*%, matrix product;

  • matpower() and ^, powers (including inverse) of a square matrix;

  • solve() and inverse(), matrix inverse of a square matrix;

  • t(), transpose;

  • determinant() of a square matrix;

  • kronecker() and %O%, the Kronecker product.

Usage

matsum(A, ...)

# S3 method for class 'latexMatrix'
matsum(A, ..., as.numeric = TRUE)

# S3 method for class 'latexMatrix'
e1 + e2

matdiff(A, B, ...)

# S3 method for class 'latexMatrix'
matdiff(A, B = NULL, as.numeric = TRUE, ...)

# S3 method for class 'latexMatrix'
e1 - e2

# S3 method for class 'latexMatrix'
e1 * e2

Dot(x, y, simplify = TRUE)

matmult(X, ...)

# S3 method for class 'latexMatrix'
matmult(X, ..., simplify = TRUE, as.numeric = TRUE)

# S3 method for class 'latexMatrix'
x %*% y

matpower(X, power, ...)

# S3 method for class 'latexMatrix'
matpower(X, power, simplify = TRUE, as.numeric = TRUE, ...)

# S3 method for class 'latexMatrix'
e1^e2

inverse(X, ...)

# S3 method for class 'latexMatrix'
inverse(X, ..., as.numeric = TRUE, simplify = TRUE)

# S3 method for class 'latexMatrix'
t(x)

# S3 method for class 'latexMatrix'
determinant(x, logarithm, ...)

# S3 method for class 'latexMatrix'
solve(
  a,
  b,
  simplify = FALSE,
  as.numeric = TRUE,
  frac = c("\\dfrac", "\\frac", "\\tfrac", "\\cfrac"),
  ...
)

# S4 method for class 'latexMatrix,latexMatrix'
kronecker(X, Y, FUN = "*", make.dimnames = FALSE, ...)

x %X% y

Arguments

A

a "latexMatrix" object

...

for matmult() and sum() zero or more "latexMatrix" objects; otherwise arguments to be passed down

as.numeric

if TRUE (the default) and the matrices to be multiplied, added, etc., can be coerced to numeric, matrix multiplication, addition, etc., is performed numerically; supersedes simplify

e1

a "latexMatrix" object; or for * a scalar;

e2

a "latexMatrix" object; for * a scalar; for ^ an integer power >= -1 to raise a square matrix

B

a "latexMatrix" object

x

for Dot a numeric or character vector; otherwise a "latexMatrix" object

y

for Dot a numeric or character vector; otherwise a "latexMatrix" object

simplify

if TRUE (the default), an attempt is made to simplify the result slightly; for solve(), return a LaTeX expression with the inverse of the determinant in front of the adjoint matrix rather than a "latexMatrix" object in which each element of the adjoint matrix is divided by the determinant

X

a "latexMatrix" object

power

to raise a square matrix to this power, an integer >= -1.

logarithm

to match the generic determinant() function, ignored

a

a "latexMatrix" object representing a square matrix

b

ignored; to match the solve() generic

frac

LaTeX command to use in forming fractions; the default is "\dfrac"

Y

a "latexMatrix" object

FUN

to match the kronecker() generic, ignored

make.dimnames

to match the kronecker() generic, ignored

Value

All of these functions return "latexMatrix" objects, except for Dot(), which returns a LaTeX expression as a character string.

Details

These operators and functions only apply to "latexMatrix" objects of definite (i.e., numeric) dimensions.

When there are both a function and an operator (e.g., matmult() and %*%), the former is more flexible via optional arguments and the latter calls the former with default arguments. For example, using the operator A %*% B multiplies the two matrices A and B, returning a symbolic result. The function matmult() multiplies two or more matrices, and can simplify the result and/or produced the numeric representation of the product.

The result of matrix multiplication, \(\mathbf{C} = \mathbf{A} \: \mathbf{B}\) is composed of the vector inner (dot) products of each row of \(\mathbf{A}\) with each column of \(\mathbf{B}\), $$c_{ij} = \mathbf{a}_i^\top \mathbf{b}_j = \Sigma_k a_{ik} \cdot b_{kj}$$

The Dot() function computes the inner product symbolically in LaTeX notation for numeric and character vectors, simplifying the result if simplify = TRUE. The LaTeX symbol for multiplication ("\cdot" by default) can be changed by changing options(latexMultSymbol), e.g, options(latexMultSymbol = "\\times") (note the double-backslash).

See also

Author

John Fox

Examples

A <- latexMatrix(symbol="a", nrow=2, ncol=2)
B <- latexMatrix(symbol="b", nrow=2, ncol=2)
A
#> \begin{pmatrix} 
#>   a_{11} & a_{12} \\ 
#>   a_{21} & a_{22} \\ 
#> \end{pmatrix}
B
#> \begin{pmatrix} 
#>   b_{11} & b_{12} \\ 
#>   b_{21} & b_{22} \\ 
#> \end{pmatrix}
A + B
#> \begin{pmatrix}  
#> a_{11} + b_{11} & a_{12} + b_{12} \\ 
#> a_{21} + b_{21} & a_{22} + b_{22} \\ 
#> \end{pmatrix}
A - B
#> \begin{pmatrix}  
#> a_{11} - b_{11} & a_{12} - b_{12} \\ 
#> a_{21} - b_{21} & a_{22} - b_{22} \\ 
#> \end{pmatrix}
"a" * A
#> \begin{pmatrix}  
#> a \cdot a_{11} & a \cdot a_{12} \\ 
#> a \cdot a_{21} & a \cdot a_{22} \\ 
#> \end{pmatrix}
C <- latexMatrix(symbol="c", nrow=2, ncol=3)
A %*% C
#> \begin{pmatrix}  
#> a_{11} \cdot c_{11} + a_{12} \cdot c_{21} & a_{11} \cdot c_{12} + a_{12} \cdot c_{22} & a_{11} \cdot c_{13} + a_{12} \cdot c_{23} \\ 
#> a_{21} \cdot c_{11} + a_{22} \cdot c_{21} & a_{21} \cdot c_{12} + a_{22} \cdot c_{22} & a_{21} \cdot c_{13} + a_{22} \cdot c_{23} \\ 
#> \end{pmatrix}
t(C)
#> \begin{pmatrix}  
#> c_{11} & c_{21} \\ 
#> c_{12} & c_{22} \\ 
#> c_{13} & c_{23} \\ 
#> \end{pmatrix}
determinant(A)
#> [1] "a_{11} \\cdot a_{22} - a_{12} \\cdot a_{21}"
cat(solve(A, simplify=TRUE))
#> \frac{1}{a_{11} \cdot a_{22} - a_{12} \cdot a_{21}} 
#> \begin{pmatrix}  
#> a_{22}  & -a_{12} \\ 
#> -a_{21} & a_{11}  \\ 
#> \end{pmatrix}
D <- latexMatrix(matrix(letters[1:4], 2, 2))
D
#> \begin{pmatrix} 
#> a & c \\ 
#> b & d \\ 
#> \end{pmatrix}
as.numeric(D, locals=list(a=1, b=2, c=3, d=4))
#>      [,1] [,2]
#> [1,]    1    3
#> [2,]    2    4
X <- latexMatrix(matrix(c(3, 2, 0, 1, 1, 1, 2,-2, 1), 3, 3))
X
#> \begin{pmatrix} 
#>  3 &  1 &  2 \\ 
#>  2 &  1 & -2 \\ 
#>  0 &  1 &  1 \\ 
#> \end{pmatrix}
as.numeric(X)
#>      [,1] [,2] [,3]
#> [1,]    3    1    2
#> [2,]    2    1   -2
#> [3,]    0    1    1
MASS::fractions(as.numeric(inverse(X)))
#>      [,1]  [,2]  [,3] 
#> [1,]  3/11  1/11 -4/11
#> [2,] -2/11  3/11 10/11
#> [3,]  2/11 -3/11  1/11
(d <- determinant(X))
#> [1] "3 \\cdot (1 \\cdot 1 - (-2) \\cdot 1) - 1 \\cdot (2 \\cdot 1 - (-2) \\cdot 0) + 2 \\cdot (2 \\cdot 1 - 1 \\cdot 0)"
eval(parse(text=(gsub("\\\\cdot", "*", d))))
#> [1] 11
X <- latexMatrix(matrix(1:6, 2, 3), matrix="bmatrix")
I3 <- latexMatrix(diag(3))
I3 %X% X
#> \begin{pmatrix}  
#> 1 \cdot 1 & 1 \cdot 3 & 1 \cdot 5 & 0         & 0         & 0         & 0         & 0         & 0         \\ 
#> 1 \cdot 2 & 1 \cdot 4 & 1 \cdot 6 & 0         & 0         & 0         & 0         & 0         & 0         \\ 
#> 0         & 0         & 0         & 1 \cdot 1 & 1 \cdot 3 & 1 \cdot 5 & 0         & 0         & 0         \\ 
#> 0         & 0         & 0         & 1 \cdot 2 & 1 \cdot 4 & 1 \cdot 6 & 0         & 0         & 0         \\ 
#> 0         & 0         & 0         & 0         & 0         & 0         & 1 \cdot 1 & 1 \cdot 3 & 1 \cdot 5 \\ 
#> 0         & 0         & 0         & 0         & 0         & 0         & 1 \cdot 2 & 1 \cdot 4 & 1 \cdot 6 \\ 
#> \end{pmatrix}
kronecker(I3, X, sparse=TRUE)
#> \begin{pmatrix}  
#> 1 \cdot 1 & 1 \cdot 3 & 1 \cdot 5 & & & & & & \\ 
#> 1 \cdot 2 & 1 \cdot 4 & 1 \cdot 6 & & & & & & \\ 
#>  & & & 1 \cdot 1 & 1 \cdot 3 & 1 \cdot 5 & & & \\ 
#>  & & & 1 \cdot 2 & 1 \cdot 4 & 1 \cdot 6 & & & \\ 
#>  & & & & & & 1 \cdot 1 & 1 \cdot 3 & 1 \cdot 5 \\ 
#>  & & & & & & 1 \cdot 2 & 1 \cdot 4 & 1 \cdot 6 \\ 
#> \end{pmatrix}

(E <- latexMatrix(diag(1:3)))
#> \begin{pmatrix} 
#> 1 & 0 & 0 \\ 
#> 0 & 2 & 0 \\ 
#> 0 & 0 & 3 \\ 
#> \end{pmatrix}
# equivalent:
X %*% E
#> \begin{bmatrix}  
#>  1 &  6 & 15 \\ 
#>  2 &  8 & 18 \\ 
#> \end{bmatrix}
matmult(X, E)
#> \begin{bmatrix}  
#>  1 &  6 & 15 \\ 
#>  2 &  8 & 18 \\ 
#> \end{bmatrix}

matmult(X, E, simplify=FALSE, as.numeric=FALSE)
#> \begin{bmatrix}  
#> 1 \cdot 1 + 3 \cdot 0 + 5 \cdot 0 & 1 \cdot 0 + 3 \cdot 2 + 5 \cdot 0 & 1 \cdot 0 + 3 \cdot 0 + 5 \cdot 3 \\ 
#> 2 \cdot 1 + 4 \cdot 0 + 6 \cdot 0 & 2 \cdot 0 + 4 \cdot 2 + 6 \cdot 0 & 2 \cdot 0 + 4 \cdot 0 + 6 \cdot 3 \\ 
#> \end{bmatrix}

# equivalent:
X %*% E %*% E
#> \begin{bmatrix}  
#>  1 & 12 & 45 \\ 
#>  2 & 16 & 54 \\ 
#> \end{bmatrix}
matmult(X, E, E)
#> \begin{bmatrix}  
#>  1 & 12 & 45 \\ 
#>  2 & 16 & 54 \\ 
#> \end{bmatrix}

# equivalent:
E^-1
#> \begin{pmatrix}  
#> 1.00000 & 0.00000 & 0.00000 \\ 
#> 0.00000 & 0.50000 & 0.00000 \\ 
#> 0.00000 & 0.00000 & 0.33333 \\ 
#> \end{pmatrix}
inverse(E)
#> \begin{pmatrix}  
#> 1.00000 & 0.00000 & 0.00000 \\ 
#> 0.00000 & 0.50000 & 0.00000 \\ 
#> 0.00000 & 0.00000 & 0.33333 \\ 
#> \end{pmatrix}
solve(E)
#> \begin{pmatrix}  
#> 1.00000 & 0.00000 & 0.00000 \\ 
#> 0.00000 & 0.50000 & 0.00000 \\ 
#> 0.00000 & 0.00000 & 0.33333 \\ 
#> \end{pmatrix}

solve(E, as.numeric=FALSE) # details
#> \begin{pmatrix}  
#> \dfrac{2 \cdot 3 - 0 \cdot 0}{1 \cdot (2 \cdot 3 - 0 \cdot 0) - 0 \cdot (0 \cdot 3 - 0 \cdot 0) + 0 \cdot (0 \cdot 0 - 2 \cdot 0)}    & \dfrac{-(0 \cdot 3 - 0 \cdot 0)}{1 \cdot (2 \cdot 3 - 0 \cdot 0) - 0 \cdot (0 \cdot 3 - 0 \cdot 0) + 0 \cdot (0 \cdot 0 - 2 \cdot 0)} & \dfrac{0 \cdot 0 - 0 \cdot 2}{1 \cdot (2 \cdot 3 - 0 \cdot 0) - 0 \cdot (0 \cdot 3 - 0 \cdot 0) + 0 \cdot (0 \cdot 0 - 2 \cdot 0)}    \\ 
#> \dfrac{-(0 \cdot 3 - 0 \cdot 0)}{1 \cdot (2 \cdot 3 - 0 \cdot 0) - 0 \cdot (0 \cdot 3 - 0 \cdot 0) + 0 \cdot (0 \cdot 0 - 2 \cdot 0)} & \dfrac{1 \cdot 3 - 0 \cdot 0}{1 \cdot (2 \cdot 3 - 0 \cdot 0) - 0 \cdot (0 \cdot 3 - 0 \cdot 0) + 0 \cdot (0 \cdot 0 - 2 \cdot 0)}    & \dfrac{-(1 \cdot 0 - 0 \cdot 0)}{1 \cdot (2 \cdot 3 - 0 \cdot 0) - 0 \cdot (0 \cdot 3 - 0 \cdot 0) + 0 \cdot (0 \cdot 0 - 2 \cdot 0)} \\ 
#> \dfrac{0 \cdot 0 - 2 \cdot 0}{1 \cdot (2 \cdot 3 - 0 \cdot 0) - 0 \cdot (0 \cdot 3 - 0 \cdot 0) + 0 \cdot (0 \cdot 0 - 2 \cdot 0)}    & \dfrac{-(1 \cdot 0 - 0 \cdot 0)}{1 \cdot (2 \cdot 3 - 0 \cdot 0) - 0 \cdot (0 \cdot 3 - 0 \cdot 0) + 0 \cdot (0 \cdot 0 - 2 \cdot 0)} & \dfrac{1 \cdot 2 - 0 \cdot 0}{1 \cdot (2 \cdot 3 - 0 \cdot 0) - 0 \cdot (0 \cdot 3 - 0 \cdot 0) + 0 \cdot (0 \cdot 0 - 2 \cdot 0)}    \\ 
#> \end{pmatrix}

# equivalent
E^3
#> \begin{pmatrix}  
#>  1 &  0 &  0 \\ 
#>  0 &  8 &  0 \\ 
#>  0 &  0 & 27 \\ 
#> \end{pmatrix}
matpower(E, 3)
#> \begin{pmatrix}  
#>  1 &  0 &  0 \\ 
#>  0 &  8 &  0 \\ 
#>  0 &  0 & 27 \\ 
#> \end{pmatrix}

matpower(E, 3, as.numeric=FALSE)
#> \begin{pmatrix}   
#> 1 & 0                   & 0                   \\ 
#> 0 & (2 \cdot 2) \cdot 2 & 0                   \\ 
#> 0 & 0                   & (3 \cdot 3) \cdot 3 \\ 
#> \end{pmatrix}