#include #ifndef USE_SSE2 // Matrix class without SIMD instructions class DMatrix3x3{ public: DMatrix3x3(){ for (unsigned int i=0;i<3;i++){ for (unsigned int j=0;j<3;j++){ mA[i][j]=0.; } } } DMatrix3x3(double c11, double c12, double c13, double c21, double c22, double c23, double c31, double c32, double c33){ mA[0][0]=c11; mA[0][1]=c12; mA[0][2]=c13; mA[1][0]=c21; mA[1][1]=c22; mA[1][2]=c23; mA[2][0]=c31; mA[2][1]=c32; mA[2][2]=c33; } ~DMatrix3x3(){}; double &operator() (int row, int col){ return mA[row][col]; } double operator() (int row, int col) const{ return mA[row][col]; } // unary minus DMatrix3x3 operator-(){ return DMatrix3x3(-mA[0][0],-mA[0][1],-mA[0][2], -mA[1][0],-mA[1][1],-mA[1][2], -mA[2][0],-mA[2][1],-mA[2][2]); } // Matrix subtraction DMatrix3x3 operator-(const DMatrix3x3 &m2){ return DMatrix3x3(mA[0][0]-m2(0,0),mA[0][1]-m2(0,1),mA[0][2]-m2(0,2), mA[1][0]-m2(1,0),mA[1][1]-m2(1,1),mA[1][2]-m2(1,2), mA[2][0]-m2(2,0),mA[2][1]-m2(2,1),mA[2][2]-m2(2,2) ); } // Matrix multiplication: (3x3) x (3x2) DMatrix3x2 operator*(const DMatrix3x2 &m2){ return DMatrix3x2(mA[0][0]*m2(0,0)+mA[0][1]*m2(1,0)+mA[0][2]*m2(2,0), mA[0][0]*m2(0,1)+mA[0][1]*m2(1,1)+mA[0][2]*m2(2,1), mA[1][0]*m2(0,0)+mA[1][1]*m2(1,0)+mA[1][2]*m2(2,0), mA[1][0]*m2(0,1)+mA[1][1]*m2(1,1)+mA[1][2]*m2(2,1), mA[2][0]*m2(0,0)+mA[2][1]*m2(1,0)+mA[2][2]*m2(2,0), mA[2][0]*m2(0,1)+mA[2][1]*m2(1,1)+mA[2][2]*m2(2,1) ); } // Matrix multiplication: (3x3) x (3x3) DMatrix3x3 operator*(const DMatrix3x3 &m2){ return DMatrix3x3(mA[0][0]*m2(0,0)+mA[0][1]*m2(1,0)+mA[0][2]*m2(2,0), mA[0][0]*m2(0,1)+mA[0][1]*m2(1,1)+mA[0][2]*m2(2,1), mA[0][0]*m2(0,2)+mA[0][1]*m2(1,2)+mA[0][2]*m2(2,2), mA[1][0]*m2(0,0)+mA[1][1]*m2(1,0)+mA[1][2]*m2(2,0), mA[1][0]*m2(0,1)+mA[1][1]*m2(1,1)+mA[1][2]*m2(2,1), mA[1][0]*m2(0,2)+mA[1][1]*m2(1,2)+mA[1][2]*m2(2,2), mA[2][0]*m2(0,0)+mA[2][1]*m2(1,0)+mA[2][2]*m2(2,0), mA[2][0]*m2(0,1)+mA[2][1]*m2(1,1)+mA[2][2]*m2(2,1), mA[2][0]*m2(0,2)+mA[2][1]*m2(1,2)+mA[2][2]*m2(2,2) ); } // Matrix inversion for a symmetric matrix DMatrix3x3 InvertSym(){ double b11=mA[1][1]*mA[2][2]-mA[1][2]*mA[2][1]; double b21=mA[1][2]*mA[2][0]-mA[1][0]*mA[2][2]; double b22=mA[0][0]*mA[2][2]-mA[0][2]*mA[2][0]; double b31=mA[1][0]*mA[2][1]-mA[1][1]*mA[2][0]; double b32=mA[0][1]*mA[2][0]-mA[0][0]*mA[2][1]; double b33=mA[0][0]*mA[1][1]-mA[0][1]*mA[1][0]; double one_over_det=1./(mA[0][0]*b11+mA[0][1]*b21+mA[0][2]*b31); return DMatrix3x3(one_over_det*b11,one_over_det*b21,one_over_det*b31, one_over_det*b21,one_over_det*b22,one_over_det*b32, one_over_det*b31,one_over_det*b32,one_over_det*b33); } void Print(){ cout << "DMatrix3x3:" <