3x3行列の逆行列を計算するルーチンです。意外と使えます。
int mat_inv_3x3(double *A, double *B)
{
double detA;
detA =
A[0 * 3 + 0]*A[1 * 3 + 1]*A[2 * 3 + 2]
+A[1 * 3 + 0]*A[2 * 3 + 1]*A[0 * 3 + 2]
+A[2 * 3 + 0]*A[0 * 3 + 1]*A[1 * 3 + 2]
-A[0 * 3 + 0]*A[2 * 3 + 1]*A[1 * 3 + 2]
-A[2 * 3 + 0]*A[1 * 3 + 1]*A[0 * 3 + 2]
-A[1 * 3 + 0]*A[0 * 3 + 1]*A[2 * 3 + 2];
if(detA == 0)
return 0;
B[0 * 3 + 0] = (A[1 * 3 + 1]*A[2 * 3 + 2] - A[1 * 3 + 2]*A[2 * 3 + 1]) / detA;
B[1 * 3 + 0] = (A[1 * 3 + 2]*A[2 * 3 + 0] - A[1 * 3 + 0]*A[2 * 3 + 2]) / detA;
B[2 * 3 + 0] = (A[1 * 3 + 0]*A[2 * 3 + 1] - A[1 * 3 + 1]*A[2 * 3 + 0]) / detA;
B[0 * 3 + 1] = (A[0 * 3 + 2]*A[2 * 3 + 1] - A[0 * 3 + 1]*A[2 * 3 + 2]) / detA;
B[1 * 3 + 1] = (A[0 * 3 + 0]*A[2 * 3 + 2] - A[0 * 3 + 2]*A[2 * 3 + 0]) / detA;
B[2 * 3 + 1] = (A[0 * 3 + 1]*A[2 * 3 + 0] - A[0 * 3 + 0]*A[2 * 3 + 1]) / detA;
B[0 * 3 + 2] = (A[0 * 3 + 1]*A[1 * 3 + 2] - A[0 * 3 + 2]*A[1 * 3 + 1]) / detA;
B[1 * 3 + 2] = (A[0 * 3 + 2]*A[1 * 3 + 0] - A[0 * 3 + 0]*A[1 * 3 + 2]) / detA;
B[2 * 3 + 2] = (A[0 * 3 + 0]*A[1 * 3 + 1] - A[0 * 3 + 1]*A[1 * 3 + 0]) / detA;
return 1;
}