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>
14 static const char *get_name() { return "Matrix"; }
22 MatrixTests::MatrixTests()
24 add(&MatrixTests::multiply, "Multiplication");
25 add(&MatrixTests::invert, "Inversion");
28 void MatrixTests::multiply()
30 static double data[] =
34 3, 6, 3, 3, 6, 3, 6, 3, 6,
38 LinAl::Matrix<double, 3, 2> a(data);
39 LinAl::Matrix<double, 2, 3> b(data+6);
40 EXPECT_EQUAL(a*b, (LinAl::Matrix<double, 3, 3>(data+12)));
41 EXPECT_EQUAL(b*a, (LinAl::Matrix<double, 2, 2>(data+21)));
44 template<typename T, unsigned N>
45 bool is_identity(const LinAl::Matrix<T, N, N> &m)
47 static const T limit = numeric_limits<T>::epsilon()*4;
48 for(unsigned i=0; i<N; ++i)
49 for(unsigned j=0; j<N; ++j)
50 if(abs(T(i==j)-m(i, j))>limit)
55 void MatrixTests::invert()
57 static double data[] =
59 1, 4, 2, 4, 8, 6, 2, 2, 4
62 LinAl::SquareMatrix<double, 3> m(data);
63 LinAl::SquareMatrix<double, 3> i = LinAl::invert(m);
64 EXPECT(is_identity(i*m));