All pastes #618791 Raw Edit

Untitled

public text v1 · immutable
·published 2007-07-14 05:44 UTC
rendered paste body
void matrix_inverse(matrix b, matrix a)
{
 int i, j, i2, pr;
 vector r;
 matrix aa;
 int used[4] = {-1, -1, -1, -1};

 matrix_copy(aa, a);
 matrix_identity(b);

 for(j = 0; j < 4; j++)
    {
     pr = -1;
     for(i = 0; i < 4; i++)
         if(used[i] < 0 && aa[i][j] != 0.0)
            {
             pr = i;
             break;
            }
     if(pr < 0) { fprintf(stderr, "No row found without a zero in column %d!\n", j); return; }
     used[pr] = j;
     for(i = 0; i < 4; i++)
        {
         if(i == pr) continue;
         vector_scale(r, b[pr], -aa[i][j]/aa[pr][j]);
         vector_add(b[i], b[i], r);
         vector_scale(r, aa[pr], -aa[i][j]/aa[pr][j]);
         vector_add(aa[i], aa[i], r);
        }
    }

 for(i = 0; i < 4; i++)
     for(i2 = i+1; i2 < 4; i2++)
         if(used[i2] == i)
            {
             vector_swap(aa[i], aa[i2]);
             vector_swap(b[i], b[i2]);
             used[i2] = used[i];
            }

 for(i = 0; i < 4; i++)
    {
     vector_scale(b[i], b[i], 1.0 / aa[i][i]);
     vector_scale(aa[i], aa[i], 1.0 / aa[i][i]);
    }
}