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