| @@ -570,7 +570,7 @@ mat_t<T, N, N> l_inverse(mat_t<T, N, N> const & L) | |||||
| { | { | ||||
| T sum = 0; | T sum = 0; | ||||
| for (int k = i ; k >= j ; --k) | |||||
| for (int k = i ; k > j ; --k) | |||||
| sum += ret[k][i] * L[j][k]; | sum += ret[k][i] * L[j][k]; | ||||
| ret[j][i] = ((i == j ? 1 : 0) - sum) / L[j][j]; | ret[j][i] = ((i == j ? 1 : 0) - sum) / L[j][j]; | ||||
| @@ -580,6 +580,31 @@ mat_t<T, N, N> l_inverse(mat_t<T, N, N> const & L) | |||||
| return ret; | return ret; | ||||
| } | } | ||||
| /* | |||||
| * Compute U matrix inverse | |||||
| */ | |||||
| template<typename T, int N> | |||||
| mat_t<T, N, N> u_inverse(mat_t<T, N, N> const & U) | |||||
| { | |||||
| mat_t<T, N, N> ret; | |||||
| for (int i = 0 ; i < N ; ++i) | |||||
| { | |||||
| for (int j = i ; j < N ; ++j) | |||||
| { | |||||
| T sum = 0; | |||||
| for (int k = i ; k < j ; ++k) | |||||
| sum += ret[k][i] * U[j][k]; | |||||
| ret[j][i] = ((i == j ? 1 : 0) - sum) / U[j][j]; | |||||
| } | |||||
| } | |||||
| return ret; | |||||
| } | |||||
| /* | /* | ||||
| * Compute square matrix inverse | * Compute square matrix inverse | ||||
| */ | */ | ||||
| @@ -187,6 +187,34 @@ lolunit_declare_fixture(MatrixTest) | |||||
| lolunit_assert_doubles_equal(identity[i][j], i == j ? 1 : 0, 1e-5); | lolunit_assert_doubles_equal(identity[i][j], i == j ? 1 : 0, 1e-5); | ||||
| } | } | ||||
| lolunit_declare_test(UInverse3x3) | |||||
| { | |||||
| mat3 m0 = inv3; | |||||
| mat3 L, U; | |||||
| lu_decomposition(inv3, L, U); | |||||
| mat3 u_inv = u_inverse(U); | |||||
| mat3 identity = u_inv * U; | |||||
| for (int i = 0 ; i < 3 ; ++i) | |||||
| for (int j = 0 ; j < 3 ; ++j) | |||||
| lolunit_assert_doubles_equal(identity[i][j], i == j ? 1 : 0, 1e-5); | |||||
| } | |||||
| lolunit_declare_test(UInverse4x4) | |||||
| { | |||||
| mat4 m0 = inv4; | |||||
| mat4 L, U; | |||||
| lu_decomposition(inv4, L, U); | |||||
| mat4 u_inv = u_inverse(U); | |||||
| mat4 identity = u_inv * U; | |||||
| for (int i = 0 ; i < 4 ; ++i) | |||||
| for (int j = 0 ; j < 4 ; ++j) | |||||
| lolunit_assert_doubles_equal(identity[i][j], i == j ? 1 : 0, 1e-5); | |||||
| } | |||||
| lolunit_declare_test(Inverse3x3) | lolunit_declare_test(Inverse3x3) | ||||
| { | { | ||||
| mat3 m0 = inv3; | mat3 m0 = inv3; | ||||