Browse Source

Function for computing inverse matrix.

vectorfields
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;
}
/**
* @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:
T _data[size*size];
};

21
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());
}
}}}

1
src/Math/Test/MatrixTest.h

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

Loading…
Cancel
Save