Encoding zooms (scaling) with a diagonal matrix#
If I want to express the fact that I am expanding or contracting a coordinate along the x axis, then I multiply the x coordinate by some scalar \(p\):
\[\begin{split}
\begin{bmatrix}
x'\\
y'\\
z'\\
\end{bmatrix} =
\begin{bmatrix}
p x\\
y\\
z\\
\end{bmatrix}
\end{split}\]
In general if I want to scale by \(p\) in \(x\), \(q\) in \(y\) and \(r\) in \(z\), then I could multiply each coordinate by the respective scaling:
\[\begin{split}
\begin{bmatrix}
x'\\
y'\\
z'\\
\end{bmatrix} =
\begin{bmatrix}
p x\\
q y\\
r z\\
\end{bmatrix}
\end{split}\]
We can do the same thing by multiplying the coordinate by a matrix with the scaling factors on the diagonal:
\[\begin{split}
\begin{bmatrix}
x'\\
y'\\
z'\\
\end{bmatrix} =
\begin{bmatrix}
p x\\
q y\\
r z\\
\end{bmatrix} =
\begin{bmatrix}
p & 0 & 0 \\
0 & q & 0 \\
0 & 0 & r \\
\end{bmatrix}
\begin{bmatrix}
x\\
y\\
z\\
\end{bmatrix}
\end{split}\]
You can make these zooming matrices with np.diag:
import numpy as np
zoom_mat = np.diag([3, 4, 5])
zoom_mat
array([[3, 0, 0],
[0, 4, 0],
[0, 0, 5]])