The Column Space
A matrix isn't just a grid of numbers — it's a machine. Feed it an input vector
\vec{x} and out comes a new vector A\vec{x}.
A natural, almost greedy question follows: as you feed in every possible input, which
outputs can the machine actually produce? Which vectors are within reach, and which are forever
out of bounds no matter what you push in? That reachable territory has a name — the
column space — and it turns out to be one of the most useful objects attached to
any matrix.
Here is the key observation that unlocks everything. Writing A by its
columns \vec{a}_1, \vec{a}_2, \dots, \vec{a}_n and
\vec{x} = (x_1, x_2, \dots, x_n), the product
A\vec{x} is exactly a weighted blend of the columns:
A\vec{x} = x_1\,\vec{a}_1 + x_2\,\vec{a}_2 + \dots + x_n\,\vec{a}_n.
So every output A\vec{x} is a linear combination of the columns,
and the input \vec{x} just supplies the weights. Sweep
\vec{x} over all of input space and you sweep the outputs over every
possible combination of the columns — which is precisely their
span. That gives the whole
idea in one line:
-
The column space of A, written
\operatorname{Col}(A), is the span of its columns.
-
Equivalently, it is the set of all outputs
\{\, A\vec{x} : \vec{x} \in \mathbb{R}^n \,\} — the
image (or range) of the linear map \vec{x}\mapsto A\vec{x}.
-
If A is m\times n, every column has
m entries, so \operatorname{Col}(A) lives
inside the output space \mathbb{R}^m.
The link that makes it matter: solvability
The column space isn't just a tidy definition — it answers the single most important question you
can ask about a linear system. Suppose you want to solve A\vec{x} = \vec{b}.
Finding a solution means finding weights x_1, \dots, x_n so that
x_1\vec{a}_1 + \dots + x_n\vec{a}_n = \vec{b} — in other words, writing
\vec{b} as a combination of the columns. But that is exactly
what it means for \vec{b} to be in the column space. So:
The system A\vec{x} = \vec{b} has a solution
if and only if \vec{b} \in \operatorname{Col}(A).
Read that both ways. If \vec{b} sits inside the reachable territory, some
input hits it — the system is consistent. If \vec{b} lies even a
hair outside, no input can ever produce it and the system has no solution at all. The
column space is the complete map of every right-hand side the system can honestly hit.
Worked example 1: is this \vec{b} reachable?
Take the 3\times 2 matrix with two independent columns
A = \begin{bmatrix} 1 & 0 \\ 1 & 1 \\ 0 & 1 \end{bmatrix}, \qquad
\vec{a}_1 = \begin{bmatrix}1\\1\\0\end{bmatrix}, \quad \vec{a}_2 = \begin{bmatrix}0\\1\\1\end{bmatrix}.
These two columns point in genuinely different directions, so their span is a flat
plane through the origin, floating inside \mathbb{R}^3 —
not a line, and not all of 3D space. That plane is \operatorname{Col}(A).
Now ask: can we solve A\vec{x} = \vec{b} for
\vec{b} = (1, 3, 2)? We need weights with
x_1\begin{bmatrix}1\\1\\0\end{bmatrix} + x_2\begin{bmatrix}0\\1\\1\end{bmatrix}
= \begin{bmatrix}1\\3\\2\end{bmatrix}
\;\Longrightarrow\; x_1 = 1,\; x_1 + x_2 = 3,\; x_2 = 2.
The first and third rows force x_1 = 1 and
x_2 = 2, and the middle row checks out:
1 + 2 = 3. Consistent! So \vec{b} = (1,3,2)
is in \operatorname{Col}(A), and
\vec{x} = (1, 2) is the input that hits it.
Now try \vec{b} = (1, 0, 1). The same reasoning gives
x_1 = 1 from the top row and x_2 = 1 from the
bottom — but then the middle row wants x_1 + x_2 = 0, i.e.
1 + 1 = 0, which is false. No weights work. This
\vec{b} lies just off the plane, so
A\vec{x} = \vec{b} is inconsistent — no solution
exists. (In fact a point (b_1, b_2, b_3) is on this particular plane
exactly when b_1 + b_3 = b_2 — check both examples against that!)
Seeing the span: two columns and a target
The figure works in the plane so we can watch it move. The blue and orange arrows are two columns
of a matrix; the grey lattice marks combinations
x_1\vec{a}_1 + x_2\vec{a}_2, and the marked point is a target
\vec{b}. Rotate the second column with the slider. While the two columns
point different ways, their combinations flood the whole plane — the column space is all of
\mathbb{R}^2 and \vec{b} is reachable. Swing the
orange column onto the blue one and the span collapses to a single line: now
\vec{b} sits off that line and A\vec{x}=\vec{b}
becomes unsolvable.
Worked example 2: a basis from the pivot columns
When the columns are not all independent, the column space is smaller than the number of
columns suggests, and we'd like a clean, minimal spanning set — a
basis. Consider
A = \begin{bmatrix} 1 & 2 & 1 \\ 2 & 4 & 3 \\ 3 & 6 & 4 \end{bmatrix}.
Notice the second column is exactly 2 times the first — a passenger that
adds no new direction. To find which columns genuinely count, row-reduce
A and see where the pivots land:
A \;\xrightarrow{\text{row reduce}}\;
\begin{bmatrix} \boxed{1} & 2 & 0 \\ 0 & 0 & \boxed{1} \\ 0 & 0 & 0 \end{bmatrix}.
The pivots sit in columns 1 and 3. The rule for a basis of the column space is
then: take those same pivot columns — but from the original matrix
A, not from the reduced form. So a basis for
\operatorname{Col}(A) is
\left\{\;
\begin{bmatrix}1\\2\\3\end{bmatrix},\;
\begin{bmatrix}1\\3\\4\end{bmatrix}
\;\right\}
\qquad\Longrightarrow\qquad \dim \operatorname{Col}(A) = 2.
Two pivots, so the column space is 2-dimensional — a plane inside
\mathbb{R}^3. That count of pivots (equal to the number of independent
columns) is exactly the rank of the matrix. The dropped column 2 was
2\vec{a}_1, already spanned by the first, so leaving it out costs us
nothing.
-
A basis for \operatorname{Col}(A) is given by the
pivot columns of A (located by row reduction, but
taken from the original A).
-
The dimension of the column space is the number of pivots, which is the
rank of A.
Engineers meet this constantly. Imagine a mixing rig with two supply lines — line 1 delivers the
blend \vec{a}_1 of three chemicals, line 2 delivers
\vec{a}_2 — and you can dial each line up or down (even in reverse, if the
line can extract as well as add). The set of final mixtures you can ever produce is exactly the
column space of A = [\,\vec{a}_1\ \vec{a}_2\,]. If a customer orders a
target mixture \vec{b}, the order is fillable precisely when
\vec{b} lies in that column space — otherwise, no setting of the dials
will ever reach it, and you either add a third supply line (a new column, enlarging the reachable
space) or tell the customer it's impossible.
That's the whole practical punch of "consistent iff
\vec{b}\in\operatorname{Col}(A)": the column space is your catalogue of
everything the machine can make, and its rank is how many truly independent knobs you've got.
Two traps snare almost everyone the first time:
-
Basis columns come from the original matrix, not the reduced one. Row
reduction is only a tool to locate which columns are pivotal — it does not
preserve the column space itself (row operations mix and change the columns). It does
preserve which columns are pivotal, so read the pivot positions off the reduced form, then
reach back and grab those same-numbered columns from A. Grabbing the
reduced columns instead gives you the wrong space entirely.
-
\operatorname{Col}(A) lives in the output space, not the
input space. For an m\times n matrix the columns have
m entries, so the column space sits in
\mathbb{R}^m (the codomain), even though the weights
\vec{x} live in \mathbb{R}^n. The set of
inputs that map to \vec{0} is a different object living in
\mathbb{R}^n — that's the
null space, a
story for another page.
Where this goes next
The column space is one half of a beautiful bookkeeping law. It measures the outputs a matrix can
reach (its rank); its partner, the
null space,
measures the inputs a matrix crushes to zero (its nullity). The
rank–nullity
theorem ties the two together: rank plus nullity always equals the number of columns.
Master the column space now and that theorem will feel almost inevitable.