inline Vector2<T_Scalar> operator*(const Vector2<T_Scalar>& v, const Matrix2<T_Scalar>& m)
 {
   Vector2<T_Scalar> t;
   t.x() = v.x()*m.e(0,0) + v.y()*m.e(1,0);
   t.y() = v.x()*m.e(0,1) + v.y()*m.e(1,1);
   return t;
 }
 //-----------------------------------------------------------------------------
 Matrix2 operator-(const Matrix2& m) const
 {
   Matrix2 t;
   for(int i=0; i<2; ++i)
     for(int j=0; j<2; ++j)
       t.e(j,i) = e(j,i) - m.e(j,i);
   return t;
 }
 //-----------------------------------------------------------------------------
 T_Scalar diff(const Matrix2& other) const
 {
   T_Scalar err = 0;
   for(int i=0; i<2; ++i)
     for(int j=0; j<2; ++j)
       if (e(j,i) > other.e(j,i)) // avoid fabs/abs
         err += e(j,i) - other.e(j,i);
       else
         err += other.e(j,i) - e(j,i);
   return err;
 }
 //-----------------------------------------------------------------------------
 Matrix2 getTransposed() const
 {
   Matrix2 m;
   for(int i=0; i<2; ++i)
     for(int j=0; j<2; ++j)
       m.e(j,i) = e(i,j);
   return m;
 }
 //-----------------------------------------------------------------------------
 Matrix2 operator*(T_Scalar d) const
 {
   Matrix2 t;
   for(int i=0; i<2; ++i)
     for(int j=0; j<2; ++j)
       t.e(j,i) = e(j,i) * d;
   return t;
 }
 //-----------------------------------------------------------------------------
 Matrix2 operator-() const
 {
   Matrix2 t;
   for(int i=0; i<2; ++i)
     for(int j=0; j<2; ++j)
       t.e(j,i) = -e(j,i);
   return t;
 }
 explicit Matrix2(const Matrix2<T>& m)
 {
   e(0,0) = (T_Scalar)m.e(0,0); e(1,0) = (T_Scalar)m.e(1,0);
   e(0,1) = (T_Scalar)m.e(0,1); e(1,1) = (T_Scalar)m.e(1,1);
 }