Definition
Entrywise
Each output cell is the sum of matching input cells.
Matrix addition combines matching cells: C[i][j] = A[i][j] + B[i][j], only when shapes match. This tutorial covers the rule, nested loops over list-of-lists, a live preview, worked Python examples, edge cases, and complexity.
Entrywise
Each output cell is the sum of matching input cells.
m × n both
Addition is defined only when dimensions match.
Rows × cols
Outer loop rows, inner loop columns, visit each cell once.
All 10s
Classic demo: complementary matrices sum to 10.
Show sum
Run the 3×3 sample matrices in the browser.
Per add
Visit each of the m·n cells exactly once.
Matrix addition is entrywise: if A and B are both m × n, then C = A + B is also m × n with C[i][j] = A[i][j] + B[i][j].
In Python interviews, matrices are usually list-of-lists. Nested loops walk every position once; if shapes differ, addition is not defined.
It is the cleanest 2D indexing warm-up — and the foundation before subtraction, multiplication, and transpose problems.
Top-left adds to top-left — never mix cells.
Validate rows and columns before looping.
Access cells with matrix[i][j].
A + B = B + A for equal-sized matrices.
In short: if shapes match, walk every cell with nested loops and set C[i][j] = A[i][j] + B[i][j].
Given two equal-sized matrices A and B, build C where each cell is the sum of corresponding cells.
# [[1, 2], [3, 4]] + [[4, 3], [2, 1]] = [[5, 5], [5, 5]]
# Same shape required; different shape → not defined | Item | Type | Description |
|---|---|---|
A, B | list[list[int]] | Two matrices with the same shape. |
| Return / print | matrix / text | Result matrix C with entrywise sums. |
function add_matrices(A, B, rows, cols):
create matrix C of shape rows x cols
for i from 0 to rows - 1:
for j from 0 to cols - 1:
C[i][j] <- A[i][j] + B[i][j]
return C | Method | Idea | Notes |
|---|---|---|
| Nested loops | C[i][j] = A[i][j] + B[i][j] | Interview default — clear indexing |
| List comprehension | Build rows with nested comps | Compact Python; same O(m·n) |
| NumPy | A + B | Production speed; show loops in interviews |
| Goal | Pattern |
|---|---|
| Rows | rows = len(mat) |
| Columns | cols = len(mat[0]) |
| Add cell | result[i][j] = a[i][j] + b[i][j] |
| Traverse | for i in range(rows): for j in range(cols) |
| Print row | print(" ".join(str(x) for x in row)) |
| Shape check | Same len for rows and each row length |
Same entrywise rule — pick the form that fits the interview.
i, j indexingClearest story for whiteboards
[[a+b...]]Idiomatic Python once loops are solid
A + BFast for large data in apps
shape firstState the dimension rule before coding
Reach for matrix addition when 2D indexing and entrywise work matter.
Nested loops plus list-of-lists indexing.
First matrix operation before multiply / transpose.
Same pattern as combining equal-sized grids.
Shift from digit loops to 2D structures.
Different shape rules — do not confuse the two.
Key benefit: one short 2D problem that locks in indexing, shape validation, and O(m·n) thinking.
Uses the same 3×3 sample matrices as Example 1. Click to display Matrix 1, Matrix 2, and the result.
Three complete Python programs — 3×3 helpers, compact 2×2, and a dimension-safe adder. Click View Output to reveal sample console results.
Reusable add and display helpers for a 3×3 pair.
Helper functions for addition and display — beginner-friendly and interview-friendly.
def add_matrices(mat1: list[list[int]], mat2: list[list[int]]) -> list[list[int]]:
rows = len(mat1)
cols = len(mat1[0])
result = []
for i in range(rows):
row = []
for j in range(cols):
row.append(mat1[i][j] + mat2[i][j])
result.append(row)
return result
def display_matrix(title: str, matrix: list[list[int]]) -> None:
print(title)
for row in matrix:
print(" ".join(str(x) for x in row))
def main() -> None:
matrix1 = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
]
matrix2 = [
[9, 8, 7],
[6, 5, 4],
[3, 2, 1],
]
result_matrix = add_matrices(matrix1, matrix2)
display_matrix("Matrix 1:", matrix1)
print()
display_matrix("Matrix 2:", matrix2)
print()
display_matrix("Resultant Matrix:", result_matrix)
if __name__ == "__main__":
main() The key line is mat1[i][j] + mat2[i][j]. Nested loops visit every matching position once; the print helper formats each row for the console.
Same logic on a smaller 2×2 dry-run.
Fixed-size loops — great for quick whiteboard checks.
def add_matrices_2x2(a: list[list[int]], b: list[list[int]]) -> list[list[int]]:
result = [[0, 0], [0, 0]]
for i in range(2):
for j in range(2):
result[i][j] = a[i][j] + b[i][j]
return result
def print_matrix(title: str, m: list[list[int]]) -> None:
print(title)
for row in m:
print(*row)
def main() -> None:
a = [
[1, 2],
[3, 4],
]
b = [
[4, 3],
[2, 1],
]
c = add_matrices_2x2(a, b)
print_matrix("A", a)
print()
print_matrix("B", b)
print()
print_matrix("A + B", c)
if __name__ == "__main__":
main() Even with fixed size 2×2, the pattern is identical: loop over rows and columns and add matching entries.
Reject mismatched or ragged matrices before adding.
Checks empty input, row counts, and uniform column lengths, then adds.
def same_shape(a: list[list[int]], b: list[list[int]]) -> bool:
if not a or not b:
return False
if len(a) != len(b):
return False
cols = len(a[0])
if cols == 0:
return False
for row in a + b:
if len(row) != cols:
return False
return True
def add_matrices_safe(a: list[list[int]], b: list[list[int]]) -> list[list[int]] | None:
if not same_shape(a, b):
return None
rows, cols = len(a), len(a[0])
return [[a[i][j] + b[i][j] for j in range(cols)] for i in range(rows)]
ok = add_matrices_safe([[1, 2], [3, 4]], [[4, 3], [2, 1]])
bad = add_matrices_safe([[1, 2]], [[1, 2], [3, 4]])
print(ok)
print(bad) Shape checks catch mismatched dimensions and ragged rows before any addition. Returning None (or raising) is clearer than silent index errors.
If row or column counts differ, stop.
For each i, j set C[i][j] = A[i][j] + B[i][j].
Print each row on its own line.
C has the same shape as A and B.
Trace each cell for [[1, 2], [3, 4]] + [[4, 3], [2, 1]].
| (i, j) | A | B | C |
|---|---|---|---|
(0, 0) | 1 | 4 | 5 |
(0, 1) | 2 | 3 | 5 |
(1, 0) | 3 | 2 | 5 |
(1, 1) | 4 | 1 | 5 |
Result: [[5, 5], [5, 5]].
Where matrix addition shows up beyond the interview prompt.
2D indexing with a one-line cell formula.
Example: write add_matrices(A, B).
Outer row / inner column with a visual result.
Example: 3×3 all-10s demo.
Combine equal-sized 2D arrays entrywise.
Example: add two intensity maps.
Master shape rules before harder matrix ops.
Example: next up: division / multiply.
Practice rejecting ragged or mismatched shapes.
Example: Example 3 above.
State O(m·n) when asked about cost.
Example: one add per cell.
Pro Tip: say “same shape, entrywise sum” before writing a single loop.
Why this pattern works well in interviews and classwork.
One cell rule: C[i][j] = A[i][j] + B[i][j].
Exactly m·n additions for an m×n pair.
2×2 examples fit on a whiteboard in seconds.
Same traversal pattern for subtraction and more.
Pro Tip: lead with nested loops; mention list comprehensions or NumPy only as follow-ups.
Small habits that keep matrix-addition solutions interview-ready.
Say “same m×n required” before coding loops.
Append a new row list each outer iteration — avoid shared references.
Four cells catch off-by-one bugs fast.
Keep matrix layout readable in console demos.
Interviewers often ask complexity right after the code.
Pro Tip: never write result = [[0] * cols] * rows — that shares row references and corrupts updates.
Mistakes that commonly break matrix-addition solutions.
Adding matrices with different sizes.
→ Validate rows and columns first.
[[0]*cols]*rows makes every row the same list.
→ Build each row separately (or use a comprehension carefully).
One row shorter than others raises index errors.
→ Check every row length equals cols.
Wrong index order corrupts rectangular matrices.
→ Keep i = row, j = column consistently.
Using row·column products for addition.
→ Addition is entrywise only.
Most matrix-addition bugs come from shape assumptions and indexing mistakes.
Never add matrices with different row or column counts.
Validate each row length before indexing.
Bad ranges skip cells or raise IndexError.
Decide whether [] + [] is allowed; guard empty rows.
Still uses the same formula — one addition.
Addition works the same for negative integers.
Handy follow-ups interviewers sometimes ask.
Try these variations to lock in the pattern.
C[i][j] = A[i][j] + B[i][j] only when dimensions match.m*n.Quick Takeaway: same shape required; add matching cells with nested loops in O(m·n).
| Operation | Time | Extra space |
|---|---|---|
Add two m × n matrices | O(m*n) | O(1) besides the output matrix |
Print an m × n matrix | O(m*n) | O(1) |
| Shape validation | O(m) row checks | O(1) |
Matrix addition is entrywise: matching cells add when shapes match. Use nested loops over list-of-lists, validate dimensions, and state O(m·n) complexity.
Practice the three examples above, then continue to matrix division for the next 2D operation.
Same shape first, then C[i][j] = A[i][j] + B[i][j] — never confuse this with multiplication.
[[0]*cols]*rowsAdd matrices the interview-friendly way.
Entrywise sum
DefinitionSame m × n
ConstraintRows then cols
Codelist[list]
PythonO(m·n)
AnalysisMatrix addition is entrywise: (A+B)ij = Aij + Bij. It is valid only when both matrices have the same number of rows and columns.
Learn how to divide two matrices entrywise with the same nested-loop pattern.
8 people found this page helpful