Inverse of a square matrix in C

SUDHEER87
Messages
25
Reaction score
0
Hello all.
Iam trying to implement an algorithm which involves several matrix inversions.The algorithm is an extended kalman filter which is a recursive one.
Can anybody help me in writing a C program to solve the inversion problem or any good links?
thanks in advance..!
 
Mathematics news on Phys.org
For performance you're probably going to be better off using an existing library like LAPACK which can be linked to from C.

There are lots of algorithms, and the best one depends on the details of your problem. Is it symmetric? Square? Sparse? Large? Numerically unstable? Requires speed? Constrained by memory usage? Etc. Sorry, I don't know anything about extended Kalman filter, but it sounds hard :P

Check out Wikipedia "Invertible matrix" for a few ideas.
 
Unrest said:
For performance you're probably going to be better off using an existing library like LAPACK which can be linked to from C.

There are lots of algorithms, and the best one depends on the details of your problem. Is it symmetric? Square? Sparse? Large? Numerically unstable? Requires speed? Constrained by memory usage? Etc. Sorry, I don't know anything about extended Kalman filter, but it sounds hard :P

Check out Wikipedia "Invertible matrix" for a few ideas.

Thanks for the reply. The algorithm is pretty tough and confusing enough to break heads.
The matrices are dynamic type,3by3 and symmetric.Thanks for the link.:blushing:
 
Oh, 3x3 narrows it down a lot! Here's a quicky that I use. You can probably make it more efficient for symmetric or if you don't need the determinant.

A is the input matrix
B is its inverse

Code:
        'Find determinant
        Det = A(1, 1) * (A(2, 2) * A(3, 3) - A(3, 2) * A(2, 3)) _
            - A(1, 2) * (A(2, 1) * A(3, 3) - A(3, 1) * A(2, 3)) _
            + A(1, 3) * (A(2, 1) * A(3, 2) - A(3, 1) * A(2, 2))

        If NonZero(Det) Then
            'B = Adj(A) / Det(A)
            B(1, 1) = (A(2, 2) * A(3, 3) - A(3, 2) * A(2, 3)) / Det
            B(1, 2) = (A(1, 3) * A(3, 2) - A(3, 3) * A(1, 2)) / Det
            B(1, 3) = (A(1, 2) * A(2, 3) - A(2, 2) * A(1, 3)) / Det

            B(2, 1) = (A(2, 3) * A(3, 1) - A(3, 3) * A(2, 1)) / Det
            B(2, 2) = (A(1, 1) * A(3, 3) - A(3, 1) * A(1, 3)) / Det
            B(2, 3) = (A(1, 3) * A(2, 1) - A(2, 3) * A(1, 1)) / Det

            B(3, 1) = (A(2, 1) * A(3, 2) - A(3, 1) * A(2, 2)) / Det
            B(3, 2) = (A(1, 2) * A(3, 1) - A(3, 2) * A(1, 1)) / Det
            B(3, 3) = (A(1, 1) * A(2, 2) - A(2, 1) * A(1, 2)) / Det
        End If
 
Unrest said:
Oh, 3x3 narrows it down a lot! Here's a quicky that I use. You can probably make it more efficient for symmetric or if you don't need the determinant.

A is the input matrix
B is its inverse

Code:
        'Find determinant
        Det = A(1, 1) * (A(2, 2) * A(3, 3) - A(3, 2) * A(2, 3)) _
            - A(1, 2) * (A(2, 1) * A(3, 3) - A(3, 1) * A(2, 3)) _
            + A(1, 3) * (A(2, 1) * A(3, 2) - A(3, 1) * A(2, 2))

        If NonZero(Det) Then
            'B = Adj(A) / Det(A)
            B(1, 1) = (A(2, 2) * A(3, 3) - A(3, 2) * A(2, 3)) / Det
            B(1, 2) = (A(1, 3) * A(3, 2) - A(3, 3) * A(1, 2)) / Det
            B(1, 3) = (A(1, 2) * A(2, 3) - A(2, 2) * A(1, 3)) / Det

            B(2, 1) = (A(2, 3) * A(3, 1) - A(3, 3) * A(2, 1)) / Det
            B(2, 2) = (A(1, 1) * A(3, 3) - A(3, 1) * A(1, 3)) / Det
            B(2, 3) = (A(1, 3) * A(2, 1) - A(2, 3) * A(1, 1)) / Det

            B(3, 1) = (A(2, 1) * A(3, 2) - A(3, 1) * A(2, 2)) / Det
            B(3, 2) = (A(1, 2) * A(3, 1) - A(3, 2) * A(1, 1)) / Det
            B(3, 3) = (A(1, 1) * A(2, 2) - A(2, 1) * A(1, 2)) / Det
        End If

thanks alot..!
i'll try this in microC software which involves some special commands for matrices and let you know if there is a problem.:blushing:
 
Insights auto threads is broken atm, so I'm manually creating these for new Insight articles. In Dirac’s Principles of Quantum Mechanics published in 1930 he introduced a “convenient notation” he referred to as a “delta function” which he treated as a continuum analog to the discrete Kronecker delta. The Kronecker delta is simply the indexed components of the identity operator in matrix algebra Source: https://www.physicsforums.com/insights/what-exactly-is-diracs-delta-function/ by...
Fermat's Last Theorem has long been one of the most famous mathematical problems, and is now one of the most famous theorems. It simply states that the equation $$ a^n+b^n=c^n $$ has no solutions with positive integers if ##n>2.## It was named after Pierre de Fermat (1607-1665). The problem itself stems from the book Arithmetica by Diophantus of Alexandria. It gained popularity because Fermat noted in his copy "Cubum autem in duos cubos, aut quadratoquadratum in duos quadratoquadratos, et...
Thread 'Imaginary Pythagorus'
I posted this in the Lame Math thread, but it's got me thinking. Is there any validity to this? Or is it really just a mathematical trick? Naively, I see that i2 + plus 12 does equal zero2. But does this have a meaning? I know one can treat the imaginary number line as just another axis like the reals, but does that mean this does represent a triangle in the complex plane with a hypotenuse of length zero? Ibix offered a rendering of the diagram using what I assume is matrix* notation...

Similar threads

Back
Top