diff --git a/glm/gtx/matrix_factorisation.inl b/glm/gtx/matrix_factorisation.inl index be7d6c8c..7f2418c0 100644 --- a/glm/gtx/matrix_factorisation.inl +++ b/glm/gtx/matrix_factorisation.inl @@ -73,7 +73,7 @@ namespace glm matType tr; matType<(C < R ? C : R), C, T, P> tq; - qr_decompose(tq, tr, tin); + qr_decompose(tin, tq, tr); tr = fliplr(tr); r = transpose(tr); diff --git a/test/gtx/gtx_matrix_factorisation.cpp b/test/gtx/gtx_matrix_factorisation.cpp index 7d32078f..40e56e4b 100644 --- a/test/gtx/gtx_matrix_factorisation.cpp +++ b/test/gtx/gtx_matrix_factorisation.cpp @@ -1,103 +1,101 @@ #define GLM_ENABLE_EXPERIMENTAL #include -const double epsilon = 1e-10f; +float const epsilon = 1e-10f; template class matType> -int test_qr(matType m) { +int test_qr(matType m) +{ + int Error = 0; + matType<(C < R ? C : R), R, T, P> q(-999); matType r(-999); - glm::qr_decompose(q, r, m); + glm::qr_decompose(m, q, r); //Test if q*r really equals the input matrix matType tm = q*r; matType err = tm - m; - for (glm::length_t i = 0; i < C; i++) { - for (glm::length_t j = 0; j < R; j++) { - if (std::abs(err[i][j]) > epsilon) return 1; - } - } + for (glm::length_t i = 0; i < C; i++) + for (glm::length_t j = 0; j < R; j++) + Error += std::abs(err[i][j]) > epsilon ? 1 : 0; //Test if the columns of q are orthonormal - for (glm::length_t i = 0; i < (C < R ? C : R); i++) { - if ((length(q[i]) - 1) > epsilon) return 2; + for (glm::length_t i = 0; i < (C < R ? C : R); i++) + { + Error += (length(q[i]) - 1) > epsilon ? 1 : 0; - for (glm::length_t j = 0; j epsilon) return 3; - } + for (glm::length_t j = 0; j epsilon ? 1 : 0; } //Test if the matrix r is upper triangular - for (glm::length_t i = 0; i < C; i++) { - for (glm::length_t j = i + 1; j < (C < R ? C : R); j++) { - if (r[i][j] != 0) return 4; - } - } + for (glm::length_t i = 0; i < C; i++) + for (glm::length_t j = i + 1; j < (C < R ? C : R); j++) + Error += r[i][j] != 0 ? 1 : 0; - return 0; + return Error; } template class matType> -int test_rq(matType m) { +int test_rq(matType m) +{ + int Error = 0; + matType q(-999); matType<(C < R ? C : R), R, T, P> r(-999); - glm::rq_decompose(r, q, m); + glm::rq_decompose(m, r, q); //Test if q*r really equals the input matrix matType tm = r*q; matType err = tm - m; - - for (glm::length_t i = 0; i < C; i++) { - for (glm::length_t j = 0; j < R; j++) { - if (std::abs(err[i][j]) > epsilon) return 1; - } - } - - + + for (glm::length_t i = 0; i < C; i++) + for (glm::length_t j = 0; j < R; j++) + Error += std::abs(err[i][j]) > epsilon ? 1 : 0; + //Test if the rows of q are orthonormal matType<(C < R ? C : R), C, T, P> tq = transpose(q); - for (glm::length_t i = 0; i < (C < R ? C : R); i++) { - if ((length(tq[i]) - 1) > epsilon) return 2; + for (glm::length_t i = 0; i < (C < R ? C : R); i++) + { + Error += (length(tq[i]) - 1) > epsilon ? 1 : 0; - for (glm::length_t j = 0; j epsilon) return 3; - } + for (glm::length_t j = 0; j epsilon ? 1 : 0; } - + //Test if the matrix r is upper triangular - for (glm::length_t i = 0; i < (C < R ? C : R); i++) { - for (glm::length_t j = R - (C < R ? C : R) + i + 1; j < R; j++) { - if (r[i][j] != 0) return 4; - } - } + for (glm::length_t i = 0; i < (C < R ? C : R); i++) + for (glm::length_t j = R - (C < R ? C : R) + i + 1; j < R; j++) + Error += r[i][j] != 0 ? 1 : 0; - return 0; + return Error; } int main() { - + int Error = 0; + //Test QR square - if(test_qr(glm::dmat3(12, 6, -4, -51, 167, 24, 4, -68, -41))) return 1; + Error += test_qr(glm::dmat3(12, 6, -4, -51, 167, 24, 4, -68, -41)) ? 1 : 0; //Test RQ square - if (test_rq(glm::dmat3(12, 6, -4, -51, 167, 24, 4, -68, -41))) return 2; + Error += test_rq(glm::dmat3(12, 6, -4, -51, 167, 24, 4, -68, -41)) ? 1 : 0; //Test QR triangular 1 - if (test_qr(glm::dmat3x4(12, 6, -4, -51, 167, 24, 4, -68, -41, 7, 2, 15))) return 3; + Error += test_qr(glm::dmat3x4(12, 6, -4, -51, 167, 24, 4, -68, -41, 7, 2, 15)) ? 1 : 0; //Test QR triangular 2 - if (test_qr(glm::dmat4x3(12, 6, -4, -51, 167, 24, 4, -68, -41, 7, 2, 15))) return 4; + Error += test_qr(glm::dmat4x3(12, 6, -4, -51, 167, 24, 4, -68, -41, 7, 2, 15)) ? 1 : 0; //Test RQ triangular 1 : Fails at the triangular test - if (test_rq(glm::dmat3x4(12, 6, -4, -51, 167, 24, 4, -68, -41, 7, 2, 15))) return 5; + Error += test_rq(glm::dmat3x4(12, 6, -4, -51, 167, 24, 4, -68, -41, 7, 2, 15)) ? 1 : 0; //Test QR triangular 2 - if (test_rq(glm::dmat4x3(12, 6, -4, -51, 167, 24, 4, -68, -41, 7, 2, 15))) return 6; + Error += test_rq(glm::dmat4x3(12, 6, -4, -51, 167, 24, 4, -68, -41, 7, 2, 15)) ? 1 : 0; - return 0; + return Error; }