Chapter 4 Matrices

We use the matrix function to create a matrix from a vector of values.

A <- matrix(c(1,2,4,8), nrow=2, ncol=2, byrow=FALSE)
A
##      [,1] [,2]
## [1,]    1    4
## [2,]    2    8
B <- matrix(c(1,2,4,8), nrow=2, ncol=2, byrow=TRUE)
B
##      [,1] [,2]
## [1,]    1    2
## [2,]    4    8

We can extract elements of the matrix with square brackets. Look up the documentation with ?"[". We can extract elements by row

A[1,]
## [1] 1 4
A[2,]
## [1] 2 8

by column

A[,1]
## [1] 1 2
A[,2]
## [1] 4 8

or by element

A[1,2]
## [1] 4
A[2,1]
## [1] 2

We can also use square brackets to replace columns, rows, or elements of a matrix.

A[1,] <- c(1, 2)
A
##      [,1] [,2]
## [1,]    1    2
## [2,]    2    8
A[,2] <- c(2, 1)
A
##      [,1] [,2]
## [1,]    1    2
## [2,]    2    1
A[2,1] <- -1
A
##      [,1] [,2]
## [1,]    1    2
## [2,]   -1    1

The arithmetic operators perform elementwise operations for matrices, as with vectors.

A + B
##      [,1] [,2]
## [1,]    2    4
## [2,]    3    9
A - B
##      [,1] [,2]
## [1,]    0    0
## [2,]   -5   -7
A * B
##      [,1] [,2]
## [1,]    1    4
## [2,]   -4    8
A / B
##       [,1]  [,2]
## [1,]  1.00 1.000
## [2,] -0.25 0.125
A ^ B
##      [,1] [,2]
## [1,]    1    4
## [2,]    1    1

To perform matrix multiplication, we use the %*% operator.

A %*% B
##      [,1] [,2]
## [1,]    9   18
## [2,]    3    6

To find the inverse of a matrix, we use the solve function.

solve(A)
##           [,1]       [,2]
## [1,] 0.3333333 -0.6666667
## [2,] 0.3333333  0.3333333

We also use the solve function to solve the equation \(Ax = b\).

solve(A, b=c(3,9))
## [1] -5  4

To find the determinant of a matrix, we use the det function.

det(A)
## [1] 3

We can write functions to extract a general matrix diagonal

gen.diag <- function(A, k) A[row(A) == col(A) - k]

and to replace a general matrix diagonal

`gen.diag<-` <- function(A, k, value) {
  A[row(A) == col(A) - k] <- value
  A
}

Let’s test these functions for extracting and replacing a general matrix diagonal.

C <- matrix(c(1,0,-1,8,1,0,-1,9,-2), nrow=3, byrow=TRUE)
C
##      [,1] [,2] [,3]
## [1,]    1    0   -1
## [2,]    8    1    0
## [3,]   -1    9   -2
gen.diag(C, -1)
## [1] 8 9
gen.diag(C, -1) <- c(2,1)
C
##      [,1] [,2] [,3]
## [1,]    1    0   -1
## [2,]    2    1    0
## [3,]   -1    1   -2

We can combine matrices and vectors with by columns with cbind and by rows with rbind.

B
##      [,1] [,2]
## [1,]    1    2
## [2,]    4    8
cbind(B, c(16, 32))
##      [,1] [,2] [,3]
## [1,]    1    2   16
## [2,]    4    8   32
rbind(B, c(16, 32))
##      [,1] [,2]
## [1,]    1    2
## [2,]    4    8
## [3,]   16   32