By the end of this section you will see a linear transformation as a geometric reshaping of all of space that keeps the origin fixed, keeps grid lines straight and evenly spaced, and is fully determined by what it does to two basis vectors. No matrices required.
A Little Idea That Ate Geometry
Through the first half of the nineteenth century, people who worked with equations kept bumping into the same kind of object. A change of coordinates in astronomy would look like , . A rotation in mechanics would look like that too. A projection onto a plane in surveying would look like that too. Different motivations, same four-number object. Nobody had a name for it yet.
In 1858, Arthur Cayley published a short paper called A Memoir on the Theory of Matrices and did something quietly radical. He stopped thinking of as a pair of equations to be solved, and started thinking of it as a single object that takes a point in the plane and returns a new point. Two such objects can be composed to get a third. Some of them have inverses. Some collapse the plane onto a line. They have an algebra of their own.
That shift — from “a system of equations to solve” to “a transformation of space” — is the entire reason linear algebra exists as a field. The matrices came later, as bookkeeping. The object came first. That object is what this section is about, and we are going to meet it without writing down a single matrix.
The Mental Picture First
Before we define anything, play with the widget below. It applies various functions to the plane and shows what happens to grid lines.
The Linearity Tester
Select a function and test whether it satisfies the linearity conditions
Both paths give the same result. This function preserves addition!
Something striking is going on. The functions marked linear all do the same three things, no matter how different they look numerically.
One. The origin stays put. Whatever else the transformation does, the point lands on .
Two. Grid lines stay straight. A straight line in the input plane maps to a straight line in the output plane. No curves, no kinks, no bending.
Three. Grid lines that were parallel and evenly spaced stay parallel and evenly spaced. The grid might be stretched, rotated, sheared, or even flattened onto a line — but it is still a regular grid of parallelograms.
The functions marked not linear break at least one of those rules. Translation slides the origin somewhere else. Squaring bends the grid into curves. Absolute value folds the plane along an axis. Whatever informal notion of “linear” the reader arrived with, those three visual invariants are the one that pays off.
The visual definition. A transformation of the plane is linear when it keeps the origin fixed, keeps lines straight, and keeps parallel lines parallel and evenly spaced. Everything else in this chapter is extracting that picture into symbols.
The Formal Definition, Earned
Here is how a mathematician writes down the pictures you just played with. Let be a function from the plane to itself. We call a linear transformation when, for every pair of vectors and every scalar , both of the following hold.
Additivity. . If you add two vectors first and then apply , you get the same answer as applying to each one separately and then adding.
Homogeneity. . If you scale a vector first and then apply , you get the same answer as applying first and then scaling.
You can fold both axioms into one statement: for all scalars and all vectors . The slogan: T commutes with addition and scalar multiplication. Those two operations are the entire structure of a vector space, so another way to say it is that preserves the structure.
Consequences you get for free
The origin is fixed. Plug into homogeneity: , which says . There is no choice about this. Any transformation that moves the origin is not linear.
Two vectors tell you everything. Every vector in the plane can be written as where and are the standard basis vectors. Apply linearity:
Read that slowly. On the left, we do not know what does to an arbitrary . On the right, we only need two things: and . The whole transformation on an infinite plane is compressed into two output vectors.
The two-vector theorem. A linear transformation is completely determined by the pair . In Chapter 4 we will give that pair a name and learn to compute with it efficiently. For now, the pair itself is .
Grid lines stay straight because the image of the line is — a straight line through in the direction . Parallel lines stay parallel because two lines in direction both map to lines in direction . Equal spacing survives because homogeneity preserves the scalar . Every picture is now a theorem.
Worked Example — By Hand
Let us fix a specific and compute with it the way a human would on paper. Choose and .
Those two outputs are all we have committed to. No formula, no matrix. Yet we can now compute for any , just by using linearity.
Take . Decompose it in terms of the basis: . Apply linearity:
Distribute the scalars: and . Add the two: . So . No matrix multiplication, no determinants. Just linearity, twice.
Drive the widget below to the state (set ) and (set ). The blue arrow lands where our by-hand calculation says it should, and the grid shows the full reshape.
Interactive: 2D Linear Transformation
The red arrow shows where e₁ = (1, 0) lands, and the blue arrow shows where e₂ = (0, 1) lands. Together, they completely determine the transformation. The grid shows how the entire plane deforms.
Notice: the origin stays at the origin, the light-colored grid lines have all become straight lines in the darker image grid, and every cell of the image grid is the same parallelogram. That is the visual fingerprint of linearity.
Python From Scratch
We now write as a Python function that takes a vector and returns its image. No NumPy, no matrices — just the two output vectors and and the linearity rule, exactly as you computed by hand.
Click any line on the right to see the values flowing through it. Lines 7–8 are the linearity rule in pure arithmetic. The additivity and homogeneity checks at the bottom are numerical sanity — if either printed pair had mismatched, the function would not be linear.
The PyTorch Way
In production, almost nobody writes the above. Hand-written loops produce the right answer, but once you have a thousand vectors to transform, or a million, Python loops are the wrong tool. PyTorch lets us bundle and into a single tensor whose columns are those images, and then apply to any vector with one multiplication.
That tensor is what Chapter 4 will formally name the matrix of T. We are not there yet, so we treat the tensor purely as bookkeeping that packs the two output vectors into one object. The operator does the same two arithmetic lines the previous code did, but as one fused operation.
What PyTorch hid, and why that hiding matters. The two dot products are still happening on line 14 — PyTorch just computes them inside a C++ kernel, which on a GPU runs thousands of these side by side. When we scale up to layers of a neural network with thousands of neurons, the difference between a Python loop and a fused kernel is roughly four orders of magnitude. That is why the matrix bookkeeping is not a notational convenience. It is the thing that makes linear algebra computationally real.
Where Engineers Actually Use This: Italic Fonts
One thing your eyes are doing right now, whether you notice it or not, is reading the output of a linear transformation. Every vector font — TrueType, OpenType, PostScript Type 1, the fonts Apple and Microsoft ship with their operating systems — stores each letter as a set of outline points. When the rendering engine needs to draw that letter on your screen, it applies a transformation to every one of those outline points before rasterizing. The PostScript language specification calls the four numbers the font matrix. They are exactly the two images and of our two-vector theorem.
The most recognizable use of the font matrix is synthetic italic. When a typeface does not ship with its own hand-drawn italic, graphics libraries synthesize one by shearing the upright glyphs: leave the horizontal direction alone, and tilt the vertical direction to the right by a fixed angle. The italic transformation sends to — horizontal stays horizontal — and sends to where is the italic angle. For this gives . That one pair of output vectors defines the italic transformation for the entire alphabet.
0° is upright. Typical italic is 10–15°.
Any word. This is linear transformation applied to glyph outlines.
The demo is the same math as the worked example, with different numbers. Pull up the shear angle, and because is linear, every glyph outline point transforms consistently: the overall letter leans, but it does not bend, because straight lines stay straight. If the transformation were not linear — say, if the engine used — the letter would warp instead of tilt, and typography would be ruined. Linear is a surprisingly strong word.
The same idea, expanded from to and promoted to three dimensions, is how every polygon in every 3D game gets positioned on your screen, how every photo gets scaled and rotated in an image editor, and how every robot arm figures out where its gripper is. Synthetic italic is the simplest honest example of a linear transformation doing real work, but it is not a toy — it ships on every font rendering stack in the world.
Pitfalls & What to Watch For
“Linear” does not mean
This is the single most common point of confusion coming from high-school algebra. The function , whose graph is a straight line, is not a linear transformation unless . Plug into it: , which is the origin only when . A genuine linear transformation must fix the origin. Functions that “look linear on a graph” but shift the origin are called affine. Neural network layers are affine (they add a bias), not linear, which matters the moment you start proving things about them.
Translation is not linear
Moving every point by a fixed vector — the transformation — is the most useful non-linear operation in graphics. It feels linear. It is not. It moves the origin to . In Chapter 6 we will see how computer graphics gets around this with homogeneous coordinates, but for now the rule is hard: a shift is never linear.
The determinant can be zero
A linear transformation is free to collapse the plane onto a line, or even to a single point. The projection that flattens everything onto the x-axis is perfectly linear — it satisfies both axioms — but it is not invertible, because once you have flattened the plane you cannot recover the lost information. We will call such transformations singular, and the number that detects them is the determinant. Not every linear transformation can be undone.
Why the image of is not a third independent fact
Students sometimes ask: if I tell you , , and , is that more information than giving the first two? It is not. By linearity , so the third value is forced. Give any basis-pair's images and the rest of is pinned down.
What This Unlocks Next
You now own the object. In the next section, we catalogue the 2D linear transformations that matter in practice — rotations, scalings, shears, reflections, projections — and learn to recognize each one from the pair alone. Then Chapter 4 finally gives that pair the name it has been earning: the matrix of the transformation.
- It preserves vector addition: .
- It preserves scalar multiplication: .
Geometrically, this means three things: the origin never moves, every straight line stays a straight line, and the spacing between parallel lines stays uniform. Under a linear transformation, the whole space gets stretched, squashed, rotated, sheared, or flipped — but never curved.
A Matrix IS a Transformation
Every linear transformation of can be written as a matrix. The key idea is deceptively simple:
The columns of a matrix are the images of the standard basis vectors.
In 2D, the standard basis is and . If a matrix
represents a linear transformation, then its first column is where lands, and its second column is where lands. That's the entire picture — once you know what happens to the two basis vectors, the rest of space follows because every vector is a linear combination of and .
2D: Play with a 2×2 Matrix
Type any matrix below. The grid you see is the image of the integer lattice under that matrix — the original square grid is not drawn, so you're seeing pure output. The red arrow is where lands (column 1); the green arrow is where lands (column 2). Try each preset in turn, then mix them.
Try the “Collapse” preset. It uses a matrix whose columns are parallel (one is a scalar multiple of the other), so the whole 2D plane gets squashed onto a single line. This is what it looks like when the determinant is zero: the transformation destroys a dimension.
3D: Play with a 3×3 Matrix
In three dimensions the story is identical — just with one more basis vector. A matrix has three columns, one for each transformed basis vector:
Below you can set all nine entries. The purple wireframe is the image of the unit cube under the matrix — its volume equals , and when the cube flattens to a plane or a line, you're watching in action.
Ten Numbers That Tell the Story
A matrix is a machine that bends, stretches, rotates, squashes, or collapses space. People extract special numbers from that machine to understand what it does. No single number tells the full story — each one answers a different question. For each of the ten most-used invariants below you get: why we compute it, how it is computed with a concrete numerical walk-through, and an interactive viewer pre-loaded with a matrix that shows the behaviour at a glance.
Our running example for the non-degenerate cases will be . It shears, it stretches, and it keeps its two dimensions, so it is a good workhorse. For degenerate cases we'll switch to , whose second column is two times its first — it crushes the plane onto a single line.
Rank & Nullity — Dimensions Surviving vs. Lost
Why we compute it. Rank tells you how many independent output directions the matrix can still reach, and nullity tells you how many input directions it throws away. If rank is full, the matrix is invertible and nothing is lost. If rank drops, some entire subspace of inputs collapses to a single point — and that subspace is the null space. Rank is the first number you should ever look at: it is the sentence “does this transformation lose information?” in numeric form.
How it's computed. Reduce the matrix to row-echelon form and count the non-zero rows. For subtract 2×row 1 from row 2:
One non-zero row ⇒ , so by the rank-nullity theorem .
See it in action. The red dashed line in the viewer below is the null space — the entire line of inputs getting squashed to the origin. Every amber grid line has collapsed onto a single line instead of covering the plane.
Determinant — Volume Scale Factor
Why we compute it. The determinant is the signed factor by which the transformation scales -dimensional volume. Its sign tells you whether the space got flipped (a left hand becomes a right hand). Its magnitude tells you whether the transformation is expanding, compressing, or (at zero) collapsing. Along with rank, this is the single most useful scalar summary of a matrix.
How it's computed. For a matrix,
Plug in :
So every area gets multiplied by 6. For the singular case : , so area becomes zero — exactly the collapse we saw under rank.
See it in action. The purple parallelogram is the image of the unit square. With A its area is exactly 6; with Flip X (next viewer) its area is 1 but orientation is reversed (you can see the parallelogram “vertices” go counterclockwise instead of clockwise).
Sign matters. Try the Flip X preset (). Det is : area scale factor 1 (unchanged), but the amber arrow now points left, flipping orientation.
Trace — Sum of Eigenvalues
Why we compute it. Trace is a cheap algebraic summary that turns out to equal the sum of eigenvalues, counted with multiplicity. It shows up everywhere: in probability as the expected value of a quadratic form, in mechanics as a conserved moment, in ML as the sum of diagonal variances. If you only have a second to look at a matrix, trace + determinant already narrows down a 2×2 matrix's behaviour to a small number of cases.
How it's computed. . For our ,
We'll see in a moment that A's eigenvalues are 3 and 2, so the sum of eigenvalues = trace identity is instantly verified: . This is a cheap “sanity check” that your eigenvalue computation didn't go sideways.
Eigenvalues & Eigenvectors — Invariant Directions
Definition. Given a square matrix , a non-zero vector is called an eigenvector if applying keeps it on its own line — i.e. the output is a scalar multiple of itself. The scalar is the eigenvalue . The defining equation is deceptively short:
Three things make this the most important pair of quantities derived from a matrix. First, an eigenvector is a direction the transformation does not bend — it only stretches or flips it. Second, any matrix that has enough independent eigenvectors can be rewritten in the eigenbasis, where it acts as a pure diagonal scaling — the cleanest possible description of a linear map. Third, when you apply repeatedly — to model a dynamical system, a Markov chain, or a deep network — the eigenvalues directly control growth, decay, oscillation, and stability.
Intuition — four ways to see it.
- Invariant lines. Most input directions get rotated by the matrix. Eigenvectors span the handful of lines that don't rotate — they only scale. A real matrix can have up to of them (though sometimes fewer, or complex ones).
- Natural modes. Think of acting on a vibrating drum or a coupled spring system. The eigenvectors are the pure modes of vibration; the eigenvalues are their frequencies (or growth rates). Any motion decomposes into a sum of these independent modes.
- Diagonalisation. If has linearly independent eigenvectors, then , where has the eigenvectors as columns and is diagonal with the eigenvalues on it. That's the algebraic punchline: every diagonalisable matrix is secretly a diagonal matrix in disguise — and the eigenvectors are the rotation you apply to uncover it.
- Long-term behaviour. Applying repeatedly gives . In the eigenbasis this becomes , which is trivial: on the diagonal. So whichever eigenvalue has the largest absolute value dominates; the trajectory pulls onto the corresponding eigenvector. (This is the iteration animation further down.)
How eigenvalues are computed. The equation rearranges to . A non-zero can satisfy this only when the matrix is singular — i.e. its determinant is zero. So:
For our running matrix ,
Two roots:
How eigenvectors are computed. For each eigenvalue, solve . For :
For :
Sanity check: ✓ and ✓. A second cheap cross-check: and . Those two identities always hold for a matrix.
See it in action. The amber dashed lines in the viewer below are exactly those two eigenvector directions. The red arrow (image of ) sits on the first amber line and is three times as long — that's . The direction sits on the second amber line and gets scaled by 2. The whole transformation decomposes into “stretch by 3 along the first amber line and by 2 along the second” — diagonal in the eigenbasis.
Complex eigenvalues mean rotation. The 90° rotation matrix has no real eigenvectors. Its characteristic polynomial is , giving . The viewer below shows those complex eigenvalues in the Matrix-invariants panel, and no amber eigenvector lines appear — because every real direction gets rotated somewhere else. The magnitude tells you this is a pure rotation (no stretching); the argument tells you the rotation angle.
Watch eigenvectors emerge from iteration. The deepest reason eigenvectors matter is this: pick any starting vector and apply to it repeatedly. The result rotates toward the eigenvector whose eigenvalue has the largest absolute value, while its length grows like . This is called power iteration, and it's the engine behind PageRank (find the dominant eigenvector of the web's link matrix), PCA (find the dominant eigenvector of the data's covariance), and countless numerical algorithms.
The viewer below turns on iteration mode: click step → to apply once, and watch the pink trajectory line up with the amber eigenvector line whose eigenvalue is biggest. The live ratio converges to .
Algebraic vs. geometric multiplicity. A matrix can have a repeated eigenvalue but still only one eigenvector direction — the classic example is the shear , whose only eigenvalue is (algebraic multiplicity 2) but whose eigenspace is the single line along (geometric multiplicity 1). Such a matrix is called defective: you cannot diagonalise it, and it instead has a Jordan block structure. The viewer correctly shows only one amber line in that case — a useful signal that the transformation is hiding coupling beyond its eigenvalues.
When you'll reach for eigenvalues and eigenvectors.
| Area | What eigenvectors / eigenvalues give you |
|---|---|
| Principal Component Analysis | The leading eigenvectors of the covariance matrix are the directions of maximal variance in the data. |
| PageRank | The dominant eigenvector of the web's stochastic link matrix is the page-ranking vector. |
| Spectral clustering | Eigenvectors of a graph's Laplacian group nodes into clusters in low dimensions. |
| Dynamical systems / stability | Linearise at a fixed point; eigenvalues of the Jacobian tell you if it's stable (|λ| < 1), unstable, or oscillatory. |
| Markov chains | The eigenvector for λ = 1 is the stationary distribution; |λ| < 1 eigenvectors decay away at rate λᵏ. |
| Differential equations | Solving ẋ = Ax: the solutions are sums of eᵗλᵢ v_i — eigenvalues give the growth/decay modes. |
| Quantum mechanics | Observables are matrices; eigenvalues are the possible measured values; eigenvectors are the measurement states. |
| Vibrations / buckling | Eigenvalues of stiffness matrices are (squares of) natural frequencies; eigenvectors are mode shapes. |
| Deep learning | Eigenvalues of weight matrices and Jacobians control gradient vanishing/explosion and learning dynamics. |
What eigenvalues tell you about the transformation.
- on some eigenvector — that direction is amplified under repeated application.
- on all eigenvectors — the matrix is a contraction; iterations converge to the origin.
- — the direction is flipped at each application.
- Complex — that pair of directions is rotated by angle and scaled by . is a pure rotation; is a spiral out; is a spiral in.
- — that eigenvector is the null direction: the matrix kills it. If present, the matrix is singular.
Together, the full spectrum of eigenvalues answers the deepest question you can ask about a linear map: over time, where does this transformation send things?
Singular Values — True Stretching Strengths
Why we compute them. Eigenvalues work best for well-behaved square matrices. Singular values work for every matrix — square, rectangular, defective — and they are always real and non-negative. They tell you the actual stretching strengths along orthogonal principal directions, which is what you need for PCA, for SVD-based compression, for solving least squares, and for defining matrix norms that behave properly.
How they're computed. Singular values are the square roots of the eigenvalues of . For our A,
Solve : . So the singular values are
Sanity checks: (i) the product ✓; (ii) the sum of squares ✓. These identities link SVD back to the determinant and Frobenius norm.
See it in action. The viewer below turns on the singular ellipse: the dashed white unit circle is the set of all input unit vectors, and the solid blue ellipse is its image under A. The ellipse's long semi-axis has length , the short one — every unit input produces an output whose length lies between those two numbers.
Spectral Norm — Maximum Amplification
Definition. The spectral norm (also called the operator 2-norm) of a matrix is the largest factor by which it can stretch the length of any vector:
Equivalently, it is the largest singular value of , or the square root of the largest eigenvalue of :
All three definitions give exactly the same number. The first is the honest meaning (“how much can this matrix amplify?”). The second and third are how you compute it from SVD or from eigenvalues of .
Three ways to see it. 1. Worst-case amplifier. Feed every unit vector into and measure the output's length. The biggest number you find is . Every output length lies between and , so the spectral norm caps the amplification.
2. Geometric — the ellipse's longest reach. The unit sphere maps to an ellipsoid whose semi-axes are the singular values. The spectral norm is literally the length of the longest semi-axis. In the viewer below, it is the distance from the origin to the blue arrowtip.
3. Lipschitz constant. For any two inputs,
The matrix cannot separate two points by more than times their original distance. If the matrix is a contraction (everything gets closer). If it is an isometry or non-expansive map (rotations and reflections live here). If some direction gets amplified.
How it's computed. Take the largest singular value we already computed for :
Concrete sanity check: feed in , get — length 3, below the 3.26 bound. Try , get — length , also below. The only unit input that reaches the bound is the first right singular vector of A, aligned with the ellipse's long axis.
When you'll reach for it.
- Dynamical systems and stability. If a system evolves via , then . So guarantees the trajectory decays to zero (stable); can blow up. This is the linear version of Lyapunov stability.
- Gradient flow / exploding gradients in deep learning. Each layer of a neural network multiplies the gradient by some . If , gradients explode; if , they vanish. Spectral normalization in GANs (Miyato et al., 2018) divides each weight matrix by its spectral norm to pin it to 1, ensuring 1-Lipschitz layers.
- Numerical error bounds. Solving with a perturbed gives a relative output error bounded by — and the condition number puts the spectral norm on top of the ratio.
- Robust control and design. In control theory the worst-case input-to-output amplification of a linear transfer function is its spectral norm; designing a controller that minimises directly bounds disturbance amplification.
- Approximation and compression. The best rank-k approximation of (the Eckart-Young theorem) has error exactly in spectral norm — the (k+1)-th singular value. This is why SVD- based low-rank compression uses the spectral norm as its natural error measure.
What it tells you about the transformation. The spectral norm isolates one specific question: what is the worst thing this matrix does? If it is < 1, the matrix is shrinking space everywhere (and repeated application will drive everything to the origin). If it equals 1, the matrix at best preserves lengths — rotations, reflections, and orthogonal projections all have spectral norm exactly 1. If it is > 1, at least one direction is being actively amplified, and that amplification compounds under iteration. Knowing just this one number lets you reason about stability, convergence of iterative solvers, robustness of ML models, and the propagation of measurement error — without ever computing the full transformation.
See it in action. The viewer below reproduces the singular ellipse for . The solid blue arrow points from the origin to the farthest point on the ellipse — its length is the spectral norm ≈ 3.26. Every unit input vector lands somewhere on that blue ellipse, so no output ever exceeds that length.
Feel the stretch on a single vector. The viewer above shows the whole ellipse of possible outputs. The one below isolates one vector at a time: drag anywhere on the canvas (or type coordinates) to set an input v, and watch the amber arrow Av land wherever the matrix carries it. The panel reports , , and the stretch ratio — try spinning around the origin and notice the ratio bobbing between and , never exceeding the spectral norm.
Frobenius Norm — Total Energy
Why we compute it. It is the simplest possible matrix norm: just the Euclidean length of the matrix treated as a vector of its entries. It's what you get when you compute an “L2 loss” over a matrix in ML, and it bounds the spectral norm from above, so if is small, the matrix can't do anything too dramatic in any direction.
How it's computed. . For A,
It equals , so it pools the two stretching strengths. For our A, ✓.
Condition Number — Numerical Fragility
Why we compute it. When you solve , a small change in can produce a change in up to times larger. A condition number close to 1 means inputs and outputs change in lockstep. A huge condition number means small measurement errors can ruin the answer. In numerical linear algebra, this is the single most important diagnostic for “can I trust this computation?”
How it's computed. Just a ratio of singular values:
For our A:
That's well-conditioned — inputs and outputs stay roughly proportional. The viewer below shows an ill-conditioned matrix instead: one direction stretches enormously while the other barely moves, so is huge. Watch the amber grid: it gets badly flattened — that squeezing is the geometric face of “ill-conditioned.”
Summary Table — Which Number Answers Which Question
| Quantity | Formula | Geometric Meaning | Degenerate When |
|---|---|---|---|
| Rank | # of independent columns | Dimensions that survive | Rank < n |
| Nullity | n − rank | Directions crushed to origin | Nullity > 0 |
| det A | signed n-volume scale | Volume multiplier (sign = orientation) | det = 0 |
| tr(A) | sum of diagonals = Σ λᵢ | Sum of natural scaling modes | — |
| λᵢ (eigenvalues) | roots of det(A−λI) = 0 | Stretch factors along invariant directions | complex ⇒ no real invariant |
| vᵢ (eigenvectors) | (A−λᵢ I) v = 0 | Directions that don't rotate | — |
| σᵢ (singular values) | √ eigenvalues of AᵀA | Principal stretching strengths | σ = 0 ⇒ dim lost |
| ‖A‖₂ | σ_max | Maximum amplification | — |
| ‖A‖_F | √Σaᵢⱼ² | Total entry energy | — |
| κ(A) | σ_max / σ_min | Numerical fragility | κ = ∞ ⇒ singular |
Why so many numbers? Because each one answers a different question, and the matrix's behaviour is rich enough that no single summary captures it all. Rank tells you what's lost; the determinant tells you how volume scales; eigenvalues tell you the natural modes; singular values tell you real stretching strength; the condition number tells you whether you can trust the computation. Together they form a toolbox — and once you've played with enough matrices in the viewers above, you start to feel which one the situation calls for.