Inverse of a square matrix in C

AI Thread Summary
The discussion focuses on implementing an algorithm for matrix inversion in C, specifically for an extended Kalman filter. Users suggest utilizing existing libraries like LAPACK for better performance, as the choice of algorithm depends on the matrix's characteristics, such as size and symmetry. A detailed method for inverting a 3x3 symmetric matrix is provided, including steps for calculating the determinant and the inverse. The original poster expresses appreciation and plans to test the provided solution in microC software. The conversation highlights the complexity of matrix inversion in the context of advanced algorithms.
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:
 
Seemingly by some mathematical coincidence, a hexagon of sides 2,2,7,7, 11, and 11 can be inscribed in a circle of radius 7. The other day I saw a math problem on line, which they said came from a Polish Olympiad, where you compute the length x of the 3rd side which is the same as the radius, so that the sides of length 2,x, and 11 are inscribed on the arc of a semi-circle. The law of cosines applied twice gives the answer for x of exactly 7, but the arithmetic is so complex that the...
Is it possible to arrange six pencils such that each one touches the other five? If so, how? This is an adaption of a Martin Gardner puzzle only I changed it from cigarettes to pencils and left out the clues because PF folks don’t need clues. From the book “My Best Mathematical and Logic Puzzles”. Dover, 1994.

Similar threads

Back
Top