# R Matrices

R matrices are two-dimensional vectors. A matrix starts with a vector and then adds dimension or dim information (e.g. rows and columns), which is stored in a memory slot for the matrix class.  The optional slot, .dimnames, holds row and column names (and their analogues for higher dimension arrays).

#### Initializing R Matrices

Initializing a matrix is similar to vector creation:

A unit matrix is easy to specify with the diag() function:

Any vector can be turned into a matrix simply by specifying its .dim slot.  To use dim(), you assign a vector of two integers specifying the number of rows and columns. For example:

To combine vectors and matrices, use the functions cbind() and rbind(). The cbind() function combines vectors column by column, and rbind() combines vectors row by row:

When vectors of different lengths are combined using cbind() or rbind(), the shorter ones are replicated cyclically so that the matrix is “filled in.” If matrices are combined, they must have matching numbers of rows when using cbind() and matching numbers of columns when using rbind() to avoid errors.

The function matrix() is used to convert objects to matrices. For example, c() will combine objects into a vector and matrix() will “fold” the group by specifying the number of columns or rows:

If you provide fewer values than arguments to matrix(), the values are replicated cyclically until the matrix is filled in. If you provide more data than necessary, excess values are discarded.

If either ncol or nrow is provided but not both, the missing argument is computed using the following relations:

• nrow – The smallest integer equal to or greater than the number of values divided by the number of columns
• ncol – The smallest integer equal to or greater than the number of values divided by the number of rows

Thus, nrow and ncol are computed to create the smallest matrix from all the values.

By default, values are placed in a matrix by column (e.g. the byrow argument is FALSE).  This construction is known as N-folding:

Alternatively, when the the byrow argument is set to TRUE, matrix construction is achieved via Z-Folding.  This is especially useful when reading in data from a text file arranged in a table or via the scan() function:

#### Naming Matrix Rows and Columns

For a vector, names are assigned to each value with using the names() function. For matrices, names are assigned to the rows and columns using dimnames() and the list() function. The list() function need only be used once and subscripting can be used thereafter.

To handle large matrices, create a list with two components, one for rows and one for columns:

To suppress row or column labels, use the NULL value for the corresponding component of the list. For example, to suppress the row labels and number the columns:

Finally, to specify the row and column labels when defining a matrix with matrix(), use the argument dimnames as follows:

#### Matrix Operators in R

The diag() command can be used either to create a diagonal matrix or to extract the diagonal matrix:

Meanwhile, the convenience functions row() and col() can be used to extract the upper or lower triangular values:

Assume next we have the matrix size as defined as follows:

The function apply(x, MARGIN, FUN) can be used to call a function, which operates across the columns (MARGIN = 2) or the rows (MARGIN = 1) of the matrix.  For example:

The sweep(x, MARGIN, STATS, FUN=”-“) function is similar, but defines differences between a matrix and the STATS input:

sweep() can also be used to manipulate all elements row by row or column by column, as shown below:

The following table defines common matrix operators:

FunctionOperation
*Dot product or element by element multiplication
%*%Matrix multipication
%c%Matrix cross multiplication
%o%Matrix outer product
apply()Returns a vector or array by applying a function
cbind()Add or bind a new column to a matrix
chol()Choleski decomposition
col()Integer matrix identifying the columns of a matrix
colMeans(); colSums()Column summaries
crossprod()Matrix cross multiplication
detDeterminant of a matrix
diag()Creates a diagonal matrix or extracts the diagonal. If x is a scalar equal to k, creates a k x k identity matrix
dim()Returns the dimensions or rank of a matrix
eigen()Eigenvalues and vetors
ginv()Generalized matrix inverse, requires the MASS package to be loaded
kronecker()Kronecker product
lower.tri()Lower triangular matrix
qr()QR matrix decomposition
rbind()Add or bind a new row to a matrix
rowMeans(); rowSums()Row summaries
slice.indexLike col() or row() but uses the MARGIN argument
solve(x); solve(x, y)Inverse of a square matrix; Returns vector x in the equation b = Ax (i.e., A-1b)
sort()Sort....best used on vector elements extracted from a matrix
sweep()element by element manipulation
t()Matrix transpose