Gan_Matrix33 m33A, m33B;
/* ... set up m33A using e.g. gan_mat33_fill_q() ... */
gan_mat33_invert_q ( &m33A, &m33B ); /* B = A^-1, OR */
m33B = gan_mat33_invert_s ( &m33A ); /* B = A^-1, OR */
gan_mat33_invert_i ( &m33A ); /* A = A^-1, in-place in A */
Note that the routine gan_mat33_invert_s() returns the structure,
rather than a pointer value, so cannot return an error condition.
Do not use it unless you are SURE that your matrix is non-singular!
The basic routines gan_mat33_invert_[qs]() are implemented as
functions rather than macros, because they require temporary variables.
There are similar routines for symmetric matrices
Gan_SquMatrix33 sm33Sa, sm33Sb;
/* ... set up sm33Sa using e.g. gan_symmat33_fill_q() ... */
gan_symmat33_invert_q ( &sm33Sa, &sm33Sb ); /* Sb = Sa^-1, OR */
sm33Sb = gan_symmat33_invert_s ( &sm33Sa ); /* Sb = Sa^-1, OR */
gan_symmat33_invert_i ( &sm33Sa ); /* Sa = Sa^-1, in-place in Sa */
and for triangular matrices
Gan_SquMatrix33 sm33La, sm33Lb;
/* ... set up sm33La using e.g. gan_ltmat33_fill_q() ... */
gan_ltmat33_invert_q ( &sm33La, &sm33Lb ); /* Lb = La^-1, OR */
sm33Lb = gan_ltmat33_invert_s ( &sm33La ); /* Lb = La^-1, OR */
gan_ltmat33_invert_i ( &sm33La ); /* La = La^-1, in-place in La */
If you don't want to invoke the error package when inversion is attempted on a singular matrix, there is a set of routines which allows to instead to return the error condition as part of the result. For instance the code fragment
Gan_Matrix33 m33A, m33B;
int error_code;
/* ... set up m33A using e.g. gan_mat33_fill_q() ... */
if ( gan_mat33_invert ( &m33A, &m33B, &error_code ) == NULL )
{
/* error found, act on it ... */
}
/* no error found */
attempts to invert matrix