Browse Source

Function for computing inverse matrix.

pull/279/head
Vladimír Vondruš 16 years ago
parent
commit
58398c3059
  1. 16
      src/Math/Matrix.h
  2. 21
      src/Math/Test/MatrixTest.cpp
  3. 1
      src/Math/Test/MatrixTest.h

16
src/Math/Matrix.h

@ -172,6 +172,22 @@ template<class T, size_t size> class Matrix {
return out; return out;
} }
/**
* @brief Inverse matrix
*/
Matrix<T, size> inverse() const {
Matrix<T, size> 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: private:
T _data[size*size]; T _data[size*size];
}; };

21
src/Math/Test/MatrixTest.cpp

@ -203,4 +203,25 @@ void MatrixTest::determinant() {
QVERIFY(d == -2); 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());
}
}}} }}}

1
src/Math/Test/MatrixTest.h

@ -33,6 +33,7 @@ class MatrixTest: public QObject {
void transposed(); void transposed();
void ij(); void ij();
void determinant(); void determinant();
void inverse();
}; };
}}} }}}

Loading…
Cancel
Save