2 #include <msp/linal/matrix.h>
3 #include <msp/linal/squarematrix.h>
4 #include <msp/test/test.h>
9 class MatrixTests: public Test::RegisteredTest<MatrixTests>
12 typedef LinAl::SquareMatrix<double, 2> Matrix2d;
13 typedef LinAl::Matrix<double, 3, 2> Matrix3x2d;
14 typedef LinAl::Matrix<double, 2, 3> Matrix2x3d;
15 typedef LinAl::SquareMatrix<double, 3> Matrix3d;
20 static const char *get_name() { return "Matrix"; }
28 MatrixTests::MatrixTests()
30 add(&MatrixTests::multiply, "Multiplication");
31 add(&MatrixTests::invert, "Inversion");
34 void MatrixTests::multiply()
36 static double data[] =
40 3, 6, 3, 3, 6, 3, 6, 3, 6,
46 EXPECT_EQUAL(a*b, Matrix3d(data+12));
47 EXPECT_EQUAL(b*a, Matrix2d(data+21));
50 template<typename T, unsigned N>
51 bool is_identity(const LinAl::Matrix<T, N, N> &m)
53 static const T limit = numeric_limits<T>::epsilon()*4;
54 for(unsigned i=0; i<N; ++i)
55 for(unsigned j=0; j<N; ++j)
56 if(abs(T(i==j)-m(i, j))>limit)
61 void MatrixTests::invert()
63 static double data[] =
65 1, 4, 2, 4, 8, 6, 2, 2, 4
69 Matrix3d i = LinAl::invert(m);
70 EXPECT(is_identity(i*m));