i am looking for a sample code implementation on how to invert a 4x4 matrix. i know there is gaussian eleminiation, LU decomposition, etc. but instead of looking at them in detail i am really just looking for the code to do this.
language ideally C++, data is available in array of 16 floats in cloumn-major order.
thank you!
here:
This was lifted from MESA implementation of the GLU library.
Inspired by @shoosh to check out MESA implementations, I found that matrix inversion looks quite different in more recent mesa releases. I suppose those are good improvements. Here's the matrix inversion code from Mesa-17.3.9:
Note: you can find this piece of code in the mesa code base:
mesa-17.3.9/src/mesa/math/m_matrix.c
.Here is a small (just one header) C++ vector math library (geared towards 3D programming). If you use it, keep in mind that layout of its matrices in memory is inverted comparing to what OpenGL expects, I had fun time figuring it out...
I 'rolled up' the MESA implementation (also wrote a couple of unit tests to ensure it actually works).
Here:
I wrote a little about this and display the pattern of positive/negative factors on my blog.
As suggested by @LiraNuna, on many platforms hardware accelerated versions of such routines are available so I'm happy to have a 'backup version' that's readable and concise.
Note: this may run 3.5 times slower or worse than the MESA implementation. You can shift the pattern of factors to remove some additions etc... but it would lose in readability and still won't be very fast.
If anyone looking for more costumized code and "easier to read", then I got this
I don't write the code, but my program did. I made a small program to make a program that calculate the determinant and inverse of any N-matrix.
I do it because once in the past I need a code that inverses 5x5 matrix, but nobody in the earth have done this so I made one.
Take a look about the program here.
EDIT: The matrix layout is row-by-row (meaning
m01
is in the first row and second column). Also the language is C#, but should be easy to convert into C.You can use the GNU Scientific Library or look the code up in it.
Edit: You seem to want the Linear Algebra section.