Inverse of a square matrix in C

  • Context: Undergrad 
  • Thread starter Thread starter SUDHEER87
  • Start date Start date
  • Tags Tags
    Inverse Matrix Square
Click For Summary

Discussion Overview

The discussion revolves around implementing an algorithm for matrix inversion in C, specifically within the context of an extended Kalman filter. Participants explore various approaches to solving the inversion problem, including the use of libraries and specific algorithms for 3x3 symmetric matrices.

Discussion Character

  • Technical explanation
  • Mathematical reasoning
  • Homework-related

Main Points Raised

  • One participant seeks assistance in writing a C program for matrix inversion as part of an extended Kalman filter algorithm.
  • Another participant suggests using an existing library like LAPACK for performance, noting that the choice of algorithm depends on various factors such as matrix properties (symmetric, sparse, etc.) and performance requirements.
  • A later reply provides a detailed algorithm for inverting a 3x3 matrix, including steps for calculating the determinant and the inverse matrix elements, while suggesting that the method could be optimized for symmetric matrices.
  • Participants express uncertainty about the complexity of the extended Kalman filter and the challenges associated with matrix inversion in this context.

Areas of Agreement / Disagreement

Participants do not reach a consensus on a single approach to matrix inversion, as multiple methods and considerations are discussed. There is acknowledgment of the complexity of the problem, particularly in relation to the extended Kalman filter.

Contextual Notes

Participants mention various factors that could influence the choice of algorithm, such as matrix size, symmetry, and numerical stability, but do not resolve how these factors should be prioritized in practice.

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..!
 
Physics 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 a lot..!
i'll try this in microC software which involves some special commands for matrices and let you know if there is a problem.:blushing:
 

Similar threads

  • · Replies 2 ·
Replies
2
Views
2K
  • · Replies 8 ·
Replies
8
Views
3K
  • · Replies 7 ·
Replies
7
Views
2K
  • · Replies 1 ·
Replies
1
Views
3K
  • · Replies 12 ·
Replies
12
Views
3K
  • · Replies 4 ·
Replies
4
Views
2K
  • · Replies 7 ·
Replies
7
Views
4K
  • · Replies 21 ·
Replies
21
Views
12K
  • · Replies 1 ·
Replies
1
Views
1K
  • · Replies 1 ·
Replies
1
Views
2K