Matrix Algebra (%*%, solve, t)
Matrix algebra in R is the set of tools — matrix multiplication with %*%, transpose with t(), and solving systems with solve() — that let you do real linear algebra on two-dimensional grids of numbers.
Learn Matrix Algebra (%*%, solve, t) in our free R course — a beginner-friendly interactive lesson with worked examples, a practice exercise and a quick…
Part of the free R course at LearnCodingFast — hands-on lessons with examples you run in your browser, plus practice exercises and a quick quiz.
By the end of this lesson you'll build matrices, multiply them the right way, transpose and invert them, and solve a system of linear equations in a single call.
What You'll Learn in This Lesson
1️⃣ Building Matrices
Use matrix() with a vector of values plus nrow and/or ncol . By default R fills down the columns ; add byrow = TRUE to fill across rows the way you'd read them. The dim() , nrow() , and ncol() helpers report the shape.
2️⃣ Multiplying and Transposing
The operator %*% performs true matrix multiplication, where each output cell is a row-times-column dot product. A plain * multiplies matching cells instead — useful, but a different operation. The transpose t() flips rows and columns.
Whenever you see a dimension-mismatch error from %*% , check that the inner dimensions agree: an m×n times an n×p gives an m×p result.
3️⃣ Inverses and Solving Systems
The single function solve() does double duty. Called with one matrix it returns the inverse; called as solve(A, b) it solves the linear system A x = b for the unknown vector x . Use det() to check invertibility and diag() to build an identity matrix.
Your turn. Fill in the # TODO blank, run it, and compare with the expected output.
Mini-Challenge: Crack the Prices
Two equations, two unknowns — exactly what solve(A, b) is built for. Remember to use byrow = TRUE so your coefficient matrix matches the way you wrote the equations.
Common Errors (and the fix)
- Using * when you meant %*% — ❌ A * B multiplies cell-by-cell. ✅ Use A %*% B for the matrix product.
- "non-conformable arguments" — ❌ inner dimensions don't match. ✅ For A %*% B , ncol(A) must equal nrow(B) .
- Inverting to solve a system — ❌ solve(A) %*% b is slower and less stable. ✅ Use solve(A, b) .
- Forgetting byrow — ❌ entries land in the wrong cells. ✅ Add byrow = TRUE when you list values row by row.
Pro Tips
- 💡 Stack matrices fast: rbind() stacks rows, cbind() glues columns side by side.
- 💡 crossprod(A) computes t(A) %*% A faster than writing it out — common in regression.
- 💡 Check shape early: a quick dim() before %*% saves you from conformability errors.
📋 Quick Reference — Matrix Algebra
Task
R Syntax
Create matrix
matrix(1:6, nrow = 2)
Matrix product
A %*% B
Transpose
t(A)
Inverse
solve(A)
Solve A x = b
solve(A, b)
Determinant
det(A)
Identity matrix
diag(n)
Frequently Asked Questions
🎉 Lesson Complete!
- ✅ matrix() builds a grid — control fill order with byrow
- ✅ %*% is the matrix product; * is elementwise
- ✅ t() transposes rows and columns
- ✅ solve(A) inverts; solve(A, b) solves a system
- ✅ det() checks invertibility; diag() makes an identity
- ✅ Next lesson: Text Wrangling with stringr
Practice quiz
What does the %*% operator do?
- Element-wise multiplication
- True matrix multiplication
- Division
- Transposition
Answer: True matrix multiplication. %*% performs linear-algebra matrix multiplication (row-times-column dot products).
What does a plain * do between two matrices?
- Matrix product
- Solves a system
- Inverts them
- Element-by-element multiplication
Answer: Element-by-element multiplication. A single * multiplies matching cells (Hadamard), requiring equal shapes.
For A %*% B to work, what must be true?
- A's columns equal B's rows
- A and B are identical
- Both must be square
- A's rows equal B's rows
Answer: A's columns equal B's rows. The inner dimensions must match: ncol(A) must equal nrow(B).
What does t(A) compute?
- The total
- The determinant
- The transpose
- The inverse
Answer: The transpose. t() transposes A, turning rows into columns.
What does solve(A) with one argument return?
- The inverse of A
- The determinant
- The transpose
- The diagonal
Answer: The inverse of A. solve(A) returns the matrix inverse of A.
Which is the preferred way to solve the system A x = b?
- solve(A) %*% b
- A %*% b
- solve(A, b)
- det(A) * b
Answer: solve(A, b). solve(A, b) is faster and more numerically stable than inverting A first.
What does det(A) tell you?
- The matrix size
- Whether A is invertible (non-zero means yes)
- The number of rows
- The transpose
Answer: Whether A is invertible (non-zero means yes). A non-zero determinant means the matrix is invertible.
How does R fill matrix(1:6, nrow = 2) by default?
- Row by row
- Randomly
- Diagonally
- Down the columns
Answer: Down the columns. R is column-major: 1 and 2 fill the first column, then 3 and 4, and so on.
What does diag(2) produce?
- A 2x2 identity matrix
- The number 2
- A diagonal of twos
- A 2-row vector
Answer: A 2x2 identity matrix. diag(n) builds an n-by-n identity matrix.
What does 'system is computationally singular' mean?
- The matrix is too large
- There are too many rows
- The matrix has no inverse (determinant ~ 0)
- b is the wrong length
Answer: The matrix has no inverse (determinant ~ 0). It signals a non-invertible matrix, so the system has no unique solution.
Continue this course
- Previous: Checkpoint: Data Analysis
- Next: Text Wrangling with stringr