Matrix3x3 &Matrix3x3::Inverse( ) { // Compute determinate ZED_FLOAT32 Det = Determinate( ); if( ZED::Arithmetic::IsZero( Det ) ) { zedTrace( "Error: Matrix::Inverse -- singular matrix!" ); return *this; } // Set this matrix as the adjoint and multiply by 1/Det to get the // inverse ZED_FLOAT32 InverseDet = 1.0f / Det; *this = Adjoint( ); m_M[ 0 ] *= InverseDet; m_M[ 1 ] *= InverseDet; m_M[ 2 ] *= InverseDet; m_M[ 3 ] *= InverseDet; m_M[ 4 ] *= InverseDet; m_M[ 5 ] *= InverseDet; m_M[ 6 ] *= InverseDet; m_M[ 7 ] *= InverseDet; m_M[ 8 ] *= InverseDet; return *this; }
bool CMatrix4x4<T>::GetInverseMatrix(CMatrix4x4 &matInverse) const { T nDeterminate = Determinate(); int i, j, sign; if(fabs(nDeterminate) < 0.0005) { return false; } for(i = 0; i < 4; i++) { for(j = 0; j < 4; j++) { sign = 1 - ((i+j)%2) * 2; Matrix3x3<T> matSub = GetSubMatrix3x3(i,j); T det = matSub.Determinate(); matInverse.m_Entries[i+j*4] = (det * sign)/nDeterminate; }//end for }//end for return true; }//end GetInverseMatrix
Vector3f Matrix3f::Solve(const Vector3f& constants) const{ float det = Determinate(); float x = SetColumn(0, constants).Determinate() / det; float y = SetColumn(1, constants).Determinate() / det; float z = SetColumn(2, constants).Determinate() / det; return(Vector3f(x, y, z)); }