I work a lot with 3D calculations, and every so often a non trivial 3D tidbit comes along. Some of these might be of use to others – and so, by the power vested in me as absolute monarch of this blog, I hereby extend its scope to some light 3D geometry. I’ll try to keep posts in this category less rigorous and yet more verbose than regular math write-ups.
Take a 3×3 matrix that you wish to invert, say M. Think of its columns as 3-dimensional vectors, A, B & C:
Now take it’s sought-after inverse, M-1, and think of its rows as 3D vectors, say v, u & w. That means essentially:
Next focus just on v, M-1 ‘s first row. What can be said of it, in terms of A, B & C? Looking in the first row of the multiplication result – the identity matrix – we see:
Which means in particular that v is orthogonal to both B and C. Assuming B and C aren’t co-linear (otherwise M wouldn’t be invertible in the first place) there is but a single direction in 3D space which is perpendicular to both, and it can be written as B×C – vector-product or cross-product of B and C. Hence v must be a multiplication by some scalar – say α – of this direction:
To deduce α remember the v must be normalized so that its dot product with A gives 1. And so:
The triple product in the denominator, A∙(B×C), should look familiar: that is in fact det(M) – the determinant of the original matrix. Had we inverted M with a more traditional apparatus, say Kramer’s rule, we would have divided by this determinant directly.
Naturally similar expressions are obtained for the other rows, u & w :
All the denominators are in fact equal, to each other and to det(M).
Why all the hassle?
First, for the fun of it. Personally I find it much easier to understand – and thus remember – geometric stories than algebraic ones.
Second, this formulation exposes several optimization opportunities.
- After computing B×C you can obtain the first of (and so all of) the denominators, by simply taking a dot product with A.
- If you need just a single row of the inverse matrix, you can calculate it directly – without having to invert the entire matrix.
This is not as far fetched as it might seem: say you formulate a 3×3 linear equation set, but you’re actually interested only in the 1st solution coordinate:Just take the 1st row of M’s inverse, as outlined above, and dot-product it with b:
Third, using analytical expressions as above for solving linear equations is generally preferable to numeric solvers. For matrices as small as 3×3, solving numerically would probably be a bad idea anyway – even traditional, tedious inverses (with adjoint matrices and all) would be preferable to numeric solutions.
BTW, higher dimensional analogues do exist – and are as easy to derive – but the main added value, namely direct geometric insight, is lost beyond three dimensions.
enjoyed your math – which makes things look much more natuarl … BTW this solution is the trivial path for vector processing instructions such as e.g. provided by x86 SSE or the GPU Cuda/OPenCL
@Anon: thanks. From my own measurements I never saw noticeable performance improvements when implementing *3d vector* operations (dot, cross, etc) with SSE, but I’ll be happy to listen if you measured otherwise.
Stay tuned, more of this stuff coming up.
Why does A*(BxC) = det(M)?
My understanding of det(M) is the (signed) volume defined by M, which consists of A, B, & C;
BxC gives an orthogonal vector to B & C;
Then how does A*(BxC) yield the volume?
The geometric explanation is that BxC is not only orthogonal to B & C, it also has length equal to the area of the BxC parallelogram. Thus, A dot that vector gives the projection of A to the normal to B-C plane (i.e., the ‘height’ of the slanted box) times the area of the base – i.e., the volume.
The algebric explanation is that BxC can be written (and is commonly defined as) a determinant of a matrix with unit vectors i, j, k at row 1, and B&C at rows 2&3. Taking a dot product of A with a vector (any vector) represented by i, j &k components amounts to replacing the i, j &k symbols with A’s coordinates (jot such a dot product down on a piece of paper and you’d see it immediately). Substituting A’s coordinated into i, j & k in the matrix defining BxC gives exactly the matrix M : A at the row 1 (where i-j-k were), B&C at rows 2&3. Thus, A*(BxC) is algebraically identical to det(M).
can you please provide geometric representation using diagram having coordinate system and how matrix and inverse look in this coordinate system.
The claim is that row 3 of the inverse is orthogonal to columns 1 & 2 of the matrix. A graphic representation would show one vector perpendicular to two others, something like this: https://ofekshilon.com/ortb/. Illustrating this for all 3 rows would just be visually cumbersome.