From 58398c3059f23afb247b9cd217fe79ee118ad4f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Thu, 30 Dec 2010 12:18:39 +0100 Subject: [PATCH] Function for computing inverse matrix. --- src/Math/Matrix.h | 16 ++++++++++++++++ src/Math/Test/MatrixTest.cpp | 21 +++++++++++++++++++++ src/Math/Test/MatrixTest.h | 1 + 3 files changed, 38 insertions(+) diff --git a/src/Math/Matrix.h b/src/Math/Matrix.h index 7b0c596a6..45c2671a9 100644 --- a/src/Math/Matrix.h +++ b/src/Math/Matrix.h @@ -172,6 +172,22 @@ template class Matrix { return out; } + /** + * @brief Inverse matrix + */ + Matrix inverse() const { + Matrix out(false); + + T _determinant = determinant(); + + for(size_t row = 0; row != size; ++row) { + for(size_t col = 0; col != size; ++col) + out.set(row, col, (((row+col) & 1) ? -1 : 1)*ij(col, row).determinant()/_determinant); + } + + return out; + } + private: T _data[size*size]; }; diff --git a/src/Math/Test/MatrixTest.cpp b/src/Math/Test/MatrixTest.cpp index 5522df25d..c21af5fae 100644 --- a/src/Math/Test/MatrixTest.cpp +++ b/src/Math/Test/MatrixTest.cpp @@ -203,4 +203,25 @@ void MatrixTest::determinant() { QVERIFY(d == -2); } +void MatrixTest::inverse() { + float m[] = { + 3, 5, 8, 4, + 4, 4, 7, 3, + 7, -1, 8, 0, + 9, 4, 5, 9 + }; + + float inverse[] = { + -60/103.0f, 71/103.0f, -4/103.0f, 3/103.0f, + -66/103.0f, 109/103.0f, -25/103.0f, -7/103.0f, + 177/412.0f, -97/206.0f, 53/412.0f, -7/206.0f, + 259/412.0f, -185/206.0f, 31/412.0f, 27/206.0f + }; + + Matrix4 _inverse = Matrix4(m).inverse(); + + QVERIFY(_inverse == Matrix4(inverse)); + QVERIFY(_inverse*Matrix4(m) == Matrix4()); +} + }}} diff --git a/src/Math/Test/MatrixTest.h b/src/Math/Test/MatrixTest.h index 3b190881d..19db2f92d 100644 --- a/src/Math/Test/MatrixTest.h +++ b/src/Math/Test/MatrixTest.h @@ -33,6 +33,7 @@ class MatrixTest: public QObject { void transposed(); void ij(); void determinant(); + void inverse(); }; }}}