[proofplan]
We prove that the assignment $E \mapsto [f_\pi]$, sending a $d$-dimensional vector bundle $\pi: E \to X$ over a compact Hausdorff space $X$ to the homotopy class of its classifying map $f_\pi: X \to \operatorname{Gr}_d(\mathbb{R}^\infty)$, gives a bijection $\operatorname{Vect}_d(X) \cong [X, \operatorname{Gr}_d(\mathbb{R}^\infty)]$. The proof has two parts: (1) any two classifying maps for isomorphic bundles are homotopic (well-definedness and injectivity), and (2) every homotopy class is realized by pulling back the tautological bundle (surjectivity).
[/proofplan]
[step:Recall the construction of classifying maps]
Let $\pi: E \to X$ be a $d$-dimensional real vector bundle over a compact Hausdorff space $X$. By the [Embedding of Vector Bundles](/theorems/2279), there exists an embedding of $E$ as a subbundle of the trivial bundle $X \times \mathbb{R}^N$ for some $N$. Under this embedding, each fiber $E_x$ becomes a $d$-dimensional subspace of $\mathbb{R}^N$. The classifying map is
\begin{align*}
f_\pi: X &\to \operatorname{Gr}_d(\mathbb{R}^N) \hookrightarrow \operatorname{Gr}_d(\mathbb{R}^\infty), \quad x \mapsto E_x,
\end{align*}
and by construction $f_\pi^* \gamma_d^{\mathbb{R}} \cong E$, where $\gamma_d^{\mathbb{R}}$ is the tautological bundle.
[/step]
[step:Show that isomorphic bundles have homotopic classifying maps]
Let $E$ and $E'$ be two $d$-dimensional bundles over $X$ with $E \cong E'$ via a bundle isomorphism $\Phi: E \xrightarrow{\sim} E'$. Choose embeddings $j: E \hookrightarrow X \times \mathbb{R}^N$ and $j': E' \hookrightarrow X \times \mathbb{R}^{N'}$. These give classifying maps $f: X \to \operatorname{Gr}_d(\mathbb{R}^N)$ and $f': X \to \operatorname{Gr}_d(\mathbb{R}^{N'})$.
**Step 1: Reduce to equal $N$.** Composing with the standard inclusions $\mathbb{R}^N \hookrightarrow \mathbb{R}^{N+N'}$ and $\mathbb{R}^{N'} \hookrightarrow \mathbb{R}^{N+N'}$, we may assume both embeddings land in $X \times \mathbb{R}^M$ for $M = N + N'$, giving classifying maps $f, f': X \to \operatorname{Gr}_d(\mathbb{R}^M)$.
**Step 2: Construct a homotopy.** The two embeddings $j$ and $j' \circ \Phi: E \hookrightarrow X \times \mathbb{R}^M$ give two subbundles of the trivial bundle $X \times \mathbb{R}^M$. We need a continuous path of embeddings connecting them.
Consider the family of maps
\begin{align*}
h_t: E \to X \times \mathbb{R}^{2M}, \quad h_t(x, v) = \bigl(x,\; (1-t) \cdot j(x,v) + t \cdot (j' \circ \Phi)(x,v)\bigr)
\end{align*}
for $t \in [0,1]$, where we embed $\mathbb{R}^M$ into the first and second copies of $\mathbb{R}^M$ inside $\mathbb{R}^{2M}$ respectively: $j$ maps into the first copy and $j' \circ \Phi$ maps into the second. More precisely, define
\begin{align*}
h_t(x, v) = \bigl(x,\; (1-t) \cdot (j(x,v), 0) + t \cdot (0, (j' \circ \Phi)(x,v))\bigr) \in X \times \mathbb{R}^{2M}.
\end{align*}
For each fixed $t \in [0,1]$ and $x \in X$, the map $v \mapsto (1-t)(j_x(v), 0) + t(0, j'_x(\Phi_x(v)))$ is a linear injection $E_x \to \mathbb{R}^{2M}$ (since $j_x$ and $j'_x \circ \Phi_x$ are linear injections into complementary copies of $\mathbb{R}^M$, and a convex combination of two linearly independent systems in complementary subspaces remains linearly independent). Therefore $h_t$ is an embedding of $E$ into $X \times \mathbb{R}^{2M}$ for each $t$.
The family $t \mapsto h_t$ defines a homotopy of classifying maps $F: [0,1] \times X \to \operatorname{Gr}_d(\mathbb{R}^{2M})$ by $F(t, x) = h_t(E_x) \in \operatorname{Gr}_d(\mathbb{R}^{2M})$. At $t = 0$, we recover $f$ (composed with the inclusion $\operatorname{Gr}_d(\mathbb{R}^M) \hookrightarrow \operatorname{Gr}_d(\mathbb{R}^{2M})$), and at $t = 1$ we recover $f'$ (similarly included). Passing to $\operatorname{Gr}_d(\mathbb{R}^\infty)$, we conclude $[f] = [f']$ in $[X, \operatorname{Gr}_d(\mathbb{R}^\infty)]$.
[guided]
The key difficulty is that two embeddings of the same (or isomorphic) bundle into a trivial bundle need not be related by a continuous path of embeddings into the *same* trivial bundle. The trick is to enlarge the ambient space: embed one copy into "the first $\mathbb{R}^M$" and the other into "the second $\mathbb{R}^M$" inside $\mathbb{R}^{2M}$, then interpolate linearly. Since the two copies sit in complementary subspaces, the interpolation never degenerates — the image of each fiber stays $d$-dimensional throughout.
This "stabilization" argument is why the classifying space is the *infinite* Grassmannian $\operatorname{Gr}_d(\mathbb{R}^\infty)$: in any finite Grassmannian $\operatorname{Gr}_d(\mathbb{R}^N)$, the homotopy might require a larger $N$, but in the direct limit all such enlargements are absorbed.
[/guided]
[/step]
[step:Show that different embeddings of the same bundle give homotopic classifying maps]
The previous step handled the case of isomorphic bundles. We also need that different choices of embedding $j: E \hookrightarrow X \times \mathbb{R}^N$ for the *same* bundle $E$ give homotopic classifying maps. This is the special case $\Phi = \operatorname{id}_E$ of the previous step: taking $E = E'$ and $\Phi = \operatorname{id}$, the same interpolation argument produces a homotopy between the two classifying maps. Therefore the homotopy class $[f_\pi] \in [X, \operatorname{Gr}_d(\mathbb{R}^\infty)]$ depends only on the isomorphism class of $E$.
[/step]
[step:Show surjectivity: every homotopy class is realized by a pullback]
Let $g: X \to \operatorname{Gr}_d(\mathbb{R}^\infty)$ be a continuous map. The pullback $g^* \gamma_d^{\mathbb{R}}$ is a $d$-dimensional vector bundle over $X$. We must show that the classifying map of $g^*\gamma_d^{\mathbb{R}}$ is homotopic to $g$.
Since $X$ is compact, the image $g(X) \subseteq \operatorname{Gr}_d(\mathbb{R}^\infty)$ is contained in some finite Grassmannian $\operatorname{Gr}_d(\mathbb{R}^N)$ (because the direct limit topology on $\operatorname{Gr}_d(\mathbb{R}^\infty)$ gives that every compact subset lies in a finite stage). The pullback $g^*\gamma_{d,N}^{\mathbb{R}}$ is embedded in $X \times \mathbb{R}^N$ by the tautological embedding: the fiber over $x$ is $g(x) \subseteq \mathbb{R}^N$. The classifying map of this embedding is exactly $g$ (by construction, the classifying map sends $x$ to the subspace $g(x)$). So $g$ is already a classifying map for $g^*\gamma_d^{\mathbb{R}}$.
[/step]
[step:Conclude the bijection]
Combining the results:
1. **Well-defined map:** The assignment $E \mapsto [f_\pi]$ descends to a well-defined function $\operatorname{Vect}_d(X) \to [X, \operatorname{Gr}_d(\mathbb{R}^\infty)]$, since isomorphic bundles and different embedding choices both give homotopic classifying maps.
2. **Injectivity:** If $[f_\pi] = [f_{\pi'}]$, then the classifying maps are homotopic. A homotopy $F: [0,1] \times X \to \operatorname{Gr}_d(\mathbb{R}^\infty)$ with $F(0, \cdot) = f_\pi$ and $F(1, \cdot) = f_{\pi'}$ gives a bundle $F^*\gamma_d^{\mathbb{R}}$ over $[0,1] \times X$ restricting to $E$ at $\{0\} \times X$ and $E'$ at $\{1\} \times X$. By the [Homotopy Invariance](/theorems/343) of pullback bundles over compact spaces (bundles over $[0,1] \times X$ are isomorphic over $\{0\}$ and $\{1\}$), $E \cong E'$.
3. **Surjectivity:** Every map $g: X \to \operatorname{Gr}_d(\mathbb{R}^\infty)$ is the classifying map of $g^*\gamma_d^{\mathbb{R}}$.
Therefore the map $\operatorname{Vect}_d(X) \to [X, \operatorname{Gr}_d(\mathbb{R}^\infty)]$ is a bijection.
[/step]