示例#1
0
void Legendre::SolveSytem(DMatrix &dMatrix, DArray &dArray) {
 double det;
 DArray dATmp = dArray;
 det = GetDeterminant(dMatrix);
//cerr << "Determinant: " << det << endl;
 for(int i = 0; i < nn; ++i) {
  DMatrix dMTmp = dMatrix;
  for(int j = 0; j < nn; ++j) {
   dMTmp[j][i] = dATmp[j];
  }
  dArray[i] = GetDeterminant(dMTmp) / det;
//cerr << "Root " << i << ": " << dArray[i] << endl;
 }
}
示例#2
0
	mat3 mat3::InvertMatrix()
	{
		const JFloat determinant = GetDeterminant();
		mat3 inverse;
		if (determinant != JFloat(0.0))
		{
			const JFloat inverseDeterminant = 1.0f / determinant;

			inverse.column0.x = inverseDeterminant * (column1.y * column2.z - column2.y * column1.z);
			inverse.column0.y = inverseDeterminant *-(column0.y * column2.z - column2.y * column0.z);
			inverse.column0.z = inverseDeterminant * (column0.y * column1.z - column0.z * column1.y);
								 
			inverse.column1.x = inverseDeterminant *-(column1.x * column2.z - column1.z * column2.x);
			inverse.column1.y = inverseDeterminant * (column0.x * column2.z - column0.z * column2.x);
			inverse.column1.z = inverseDeterminant *-(column0.x * column1.z - column0.z * column1.x);
								
			inverse.column2.x = inverseDeterminant * (column1.x * column2.y - column1.y * column2.x);
			inverse.column2.y = inverseDeterminant *-(column0.x * column2.y - column0.y * column2.x);
			inverse.column2.z = inverseDeterminant * (column0.x * column1.y - column1.x * column0.y);

			return inverse;
		}
		else
		{
			return CreateIdentity();
		}
	}
示例#3
0
文件: matrix2f.cpp 项目: lvxejay/USD
GfMatrix2f
GfMatrix2f::GetInverse(double *detPtr, double eps) const
{
    double det = GetDeterminant();

    if (detPtr) {
        // CODE_COVERAGE_OFF_NO_REPORT This is inaccessible from script and not
        // worth writing a whole C++ test for.
	*detPtr = det;
        // CODE_COVERAGE_ON_NO_REPORT
    }

    GfMatrix2f inverse;

    if (GfAbs(det) > eps) {

        double rcp = 1.0 / det;
        inverse._mtx[0][0] = static_cast<float>(_mtx[1][1]*rcp);
        inverse._mtx[0][1] = static_cast<float>(_mtx[0][1]*-rcp);
        inverse._mtx[1][0] = static_cast<float>(_mtx[1][0]*-rcp);
        inverse._mtx[1][1] = static_cast<float>(_mtx[0][0]*rcp);
    }
    else {
	inverse.SetDiagonal(FLT_MAX);
    }

    return inverse;

}
示例#4
0
文件: matrix3d.cpp 项目: lvxejay/USD
double
GfMatrix3d::GetHandedness() const
{
    // Note: This can be computed with fewer arithmetic operations using a
    //       cross and dot product, but it is more important that the result
    //       is consistent with the way the determinant is computed.
    return GfSgn(GetDeterminant());
}
Matrix Matrix::Inverse()
{
	//transpose matrix
	Matrix Tran = Transpose();

	//cofactors
	float *A = GetMatrix();
	Matrix Cofactors((A[4]*A[8] - A[5]*A[7]), -(A[3]*A[8] - A[5]*A[6]), (A[3]*A[7] - A[4]*A[6]),
		-(A[1]*A[8] - A[2]*A[7]), (A[0]*A[8] - A[2]*A[6]), -(A[0]*A[7] - A[1]*A[6]),
		(A[1]*A[5] - A[2]*A[4]), -(A[0]*A[5] - A[2]*A[3]), (A[0]*A[4] - A[1]*A[3]));

	//find determinant
	float det1 = GetDeterminant();

	//Scale by determinant to find inverse
	return Cofactors/det1;

}
示例#6
0
    //
    // Invert
    //
    bool Mat2::Invert()
    {
        float Det = GetDeterminant();
        
        if (Abs( Det ) < EPSILON)
            return false;

        std::swap( m[ 0 ][ 0 ], m[ 1 ][ 1 ] );
        m[ 0 ][ 1 ] = -m[ 0 ][ 1 ];
        m[ 1 ][ 0 ] = -m[ 1 ][ 0 ];

        if (Abs( 1.0f - Det ) > EPSILON) 
        {
            m[ 0 ] /= Det;
            m[ 1 ] /= Det;
        }

        return true;
    }
示例#7
0
hsMatrix44* hsMatrix44::GetInverse(hsMatrix44* inverse) const
{
    float det = GetDeterminant();
    int i,j;

    if (det == 0.0f)
    {
        inverse->Reset();
        return inverse;
    }

    det = hsInvert(det);
    GetAdjoint(inverse);

    for (i=0; i<4; i++)
        for (j=0; j<4; j++)
            inverse->fMap[i][j] *= det;

    return inverse;
}
示例#8
0
文件: lpl.cpp 项目: vtsozik/methods
double Laplacian::GetDeterminant(int row /* = 0*/, BArray arr /* = BArray()*/) {
 int size = input_.size();
 double sum = 0., mult = 1.;
 int new_row = row + 1;
 if(arr.empty()) {
  arr = empty_;
 }
 for(int i = 0; i < size; ++i) {
  if(!arr[i]) {
   if(new_row < size) {
    if(input_[row][i] != 0.) {
     BArray new_arr = arr;
     new_arr[i] = true;  
     sum += (mult * input_[row][i] * GetDeterminant(new_row, new_arr));
    }
    mult *= -1.;
   } else {
    return input_[row][i];
   }
  }
 }
 return sum;
}
示例#9
0
float tmatrix::Inverse(bool affine)
{
    float det = 0;

    if(affine)
    {
        det = GetDeterminant();
        float s = 1 / det;
        float v00 = (m[1][1]*m[2][2] - m[1][2]*m[2][1]) * s;
        float v01 = (m[2][1]*m[0][2] - m[2][2]*m[0][1]) * s;
        float v02 = (m[0][1]*m[1][2] - m[0][2]*m[1][1]) * s;
        float v10 = (m[1][2]*m[2][0] - m[1][0]*m[2][2]) * s;
        float v11 = (m[2][2]*m[0][0] - m[2][0]*m[0][2]) * s;
        float v12 = (m[0][2]*m[1][0] - m[0][0]*m[1][2]) * s;
        float v20 = (m[1][0]*m[2][1] - m[1][1]*m[2][0]) * s;
        float v21 = (m[2][0]*m[0][1] - m[2][1]*m[0][0]) * s;
        float v22 = (m[0][0]*m[1][1] - m[0][1]*m[1][0]) * s;
        float v30 = -(v00*m[3][0] + v10*m[3][1] + v20*m[3][2]);
        float v31 = -(v01*m[3][0] + v11*m[3][1] + v21*m[3][2]);
        float v32 = -(v02*m[3][0] + v12*m[3][1] + v22*m[3][2]);
        m[0][0] = v00;
        m[0][1] = v01;
        m[0][2] = v02;
        m[1][0] = v10;
        m[1][1] = v11;
        m[1][2] = v12;
        m[2][0] = v20;
        m[2][1] = v21;
        m[2][2] = v22;
        m[3][0] = v30;
        m[3][1] = v31;
        m[3][2] = v32;
    }
    else
    {
        // transpose matrix
        float src[16];
        for ( int i=0; i<4; ++i )
        {
            src[i]      = m16[i*4];
            src[i + 4]  = m16[i*4 + 1];
            src[i + 8]  = m16[i*4 + 2];
            src[i + 12] = m16[i*4 + 3];
        }

        // calculate pairs for first 8 elements (cofactors)
        float tmp[12]; // temp array for pairs
        tmp[0]  = src[10] * src[15];
        tmp[1]  = src[11] * src[14];
        tmp[2]  = src[9]  * src[15];
        tmp[3]  = src[11] * src[13];
        tmp[4]  = src[9]  * src[14];
        tmp[5]  = src[10] * src[13];
        tmp[6]  = src[8]  * src[15];
        tmp[7]  = src[11] * src[12];
        tmp[8]  = src[8]  * src[14];
        tmp[9]  = src[10] * src[12];
        tmp[10] = src[8]  * src[13];
        tmp[11] = src[9]  * src[12];

        // calculate first 8 elements (cofactors)
        m16[0] = (tmp[0] * src[5] + tmp[3] * src[6] + tmp[4]  * src[7]) - (tmp[1] * src[5] + tmp[2] * src[6] + tmp[5]  * src[7]);
        m16[1] = (tmp[1] * src[4] + tmp[6] * src[6] + tmp[9]  * src[7]) - (tmp[0] * src[4] + tmp[7] * src[6] + tmp[8]  * src[7]);
        m16[2] = (tmp[2] * src[4] + tmp[7] * src[5] + tmp[10] * src[7]) - (tmp[3] * src[4] + tmp[6] * src[5] + tmp[11] * src[7]);
        m16[3] = (tmp[5] * src[4] + tmp[8] * src[5] + tmp[11] * src[6]) - (tmp[4] * src[4] + tmp[9] * src[5] + tmp[10] * src[6]);
        m16[4] = (tmp[1] * src[1] + tmp[2] * src[2] + tmp[5]  * src[3]) - (tmp[0] * src[1] + tmp[3] * src[2] + tmp[4]  * src[3]);
        m16[5] = (tmp[0] * src[0] + tmp[7] * src[2] + tmp[8]  * src[3]) - (tmp[1] * src[0] + tmp[6] * src[2] + tmp[9]  * src[3]);
        m16[6] = (tmp[3] * src[0] + tmp[6] * src[1] + tmp[11] * src[3]) - (tmp[2] * src[0] + tmp[7] * src[1] + tmp[10] * src[3]);
        m16[7] = (tmp[4] * src[0] + tmp[9] * src[1] + tmp[10] * src[2]) - (tmp[5] * src[0] + tmp[8] * src[1] + tmp[11] * src[2]);

        // calculate pairs for second 8 elements (cofactors)
        tmp[0]  = src[2] * src[7];
        tmp[1]  = src[3] * src[6];
        tmp[2]  = src[1] * src[7];
        tmp[3]  = src[3] * src[5];
        tmp[4]  = src[1] * src[6];
        tmp[5]  = src[2] * src[5];
        tmp[6]  = src[0] * src[7];
        tmp[7]  = src[3] * src[4];
        tmp[8]  = src[0] * src[6];
        tmp[9]  = src[2] * src[4];
        tmp[10] = src[0] * src[5];
        tmp[11] = src[1] * src[4];

        // calculate second 8 elements (cofactors)
        m16[8]  = (tmp[0]  * src[13] + tmp[3]  * src[14] + tmp[4]  * src[15]) - (tmp[1]  * src[13] + tmp[2]  * src[14] + tmp[5]  * src[15]);
        m16[9]  = (tmp[1]  * src[12] + tmp[6]  * src[14] + tmp[9]  * src[15]) - (tmp[0]  * src[12] + tmp[7]  * src[14] + tmp[8]  * src[15]);
        m16[10] = (tmp[2]  * src[12] + tmp[7]  * src[13] + tmp[10] * src[15]) - (tmp[3]  * src[12] + tmp[6]  * src[13] + tmp[11] * src[15]);
        m16[11] = (tmp[5]  * src[12] + tmp[8]  * src[13] + tmp[11] * src[14]) - (tmp[4]  * src[12] + tmp[9]  * src[13] + tmp[10] * src[14]);
        m16[12] = (tmp[2]  * src[10] + tmp[5]  * src[11] + tmp[1]  * src[9])  - (tmp[4]  * src[11] + tmp[0]  * src[9]  + tmp[3]  * src[10]);
        m16[13] = (tmp[8]  * src[11] + tmp[0]  * src[8]  + tmp[7]  * src[10]) - (tmp[6]  * src[10] + tmp[9]  * src[11] + tmp[1]  * src[8]);
        m16[14] = (tmp[6]  * src[9]  + tmp[11] * src[11] + tmp[3]  * src[8])  - (tmp[10] * src[11] + tmp[2]  * src[8]  + tmp[7]  * src[9]);
        m16[15] = (tmp[10] * src[10] + tmp[4]  * src[8]  + tmp[9]  * src[9])  - (tmp[8]  * src[9]  + tmp[11] * src[10] + tmp[5]  * src[8]);

        // calculate determinant
        float det = src[0]*m16[0]+src[1]*m16[1]+src[2]*m16[2]+src[3]*m16[3];

        // calculate matrix inverse
        float invdet = 1 / det;
        for ( int j=0; j<16; ++j )
        {
            m16[j] *= invdet;
        }
    }

    return det;

}
示例#10
0
float tmatrix::Inverse(const tmatrix &srcMatrix, bool affine )
{
    float det = 0;

    if(affine)
    {
        det = GetDeterminant();
        float s = 1 / det;
        m[0][0] = (srcMatrix.m[1][1]*srcMatrix.m[2][2] - srcMatrix.m[1][2]*srcMatrix.m[2][1]) * s;
        m[0][1] = (srcMatrix.m[2][1]*srcMatrix.m[0][2] - srcMatrix.m[2][2]*srcMatrix.m[0][1]) * s;
        m[0][2] = (srcMatrix.m[0][1]*srcMatrix.m[1][2] - srcMatrix.m[0][2]*srcMatrix.m[1][1]) * s;
        m[1][0] = (srcMatrix.m[1][2]*srcMatrix.m[2][0] - srcMatrix.m[1][0]*srcMatrix.m[2][2]) * s;
        m[1][1] = (srcMatrix.m[2][2]*srcMatrix.m[0][0] - srcMatrix.m[2][0]*srcMatrix.m[0][2]) * s;
        m[1][2] = (srcMatrix.m[0][2]*srcMatrix.m[1][0] - srcMatrix.m[0][0]*srcMatrix.m[1][2]) * s;
        m[2][0] = (srcMatrix.m[1][0]*srcMatrix.m[2][1] - srcMatrix.m[1][1]*srcMatrix.m[2][0]) * s;
        m[2][1] = (srcMatrix.m[2][0]*srcMatrix.m[0][1] - srcMatrix.m[2][1]*srcMatrix.m[0][0]) * s;
        m[2][2] = (srcMatrix.m[0][0]*srcMatrix.m[1][1] - srcMatrix.m[0][1]*srcMatrix.m[1][0]) * s;
        m[3][0] = -(m[0][0]*srcMatrix.m[3][0] + m[1][0]*srcMatrix.m[3][1] + m[2][0]*srcMatrix.m[3][2]);
        m[3][1] = -(m[0][1]*srcMatrix.m[3][0] + m[1][1]*srcMatrix.m[3][1] + m[2][1]*srcMatrix.m[3][2]);
        m[3][2] = -(m[0][2]*srcMatrix.m[3][0] + m[1][2]*srcMatrix.m[3][1] + m[2][2]*srcMatrix.m[3][2]);
    }
    else
    {
        // transpose matrix
        float src[16];
        for ( int i=0; i<4; ++i )
        {
            src[i]      = srcMatrix.m16[i*4];
            src[i + 4]  = srcMatrix.m16[i*4 + 1];
            src[i + 8]  = srcMatrix.m16[i*4 + 2];
            src[i + 12] = srcMatrix.m16[i*4 + 3];
        }

        // calculate pairs for first 8 elements (cofactors)
        float tmp[12]; // temp array for pairs
        tmp[0]  = src[10] * src[15];
        tmp[1]  = src[11] * src[14];
        tmp[2]  = src[9]  * src[15];
        tmp[3]  = src[11] * src[13];
        tmp[4]  = src[9]  * src[14];
        tmp[5]  = src[10] * src[13];
        tmp[6]  = src[8]  * src[15];
        tmp[7]  = src[11] * src[12];
        tmp[8]  = src[8]  * src[14];
        tmp[9]  = src[10] * src[12];
        tmp[10] = src[8]  * src[13];
        tmp[11] = src[9]  * src[12];

        // calculate first 8 elements (cofactors)
        m16[0] = (tmp[0] * src[5] + tmp[3] * src[6] + tmp[4]  * src[7]) - (tmp[1] * src[5] + tmp[2] * src[6] + tmp[5]  * src[7]);
        m16[1] = (tmp[1] * src[4] + tmp[6] * src[6] + tmp[9]  * src[7]) - (tmp[0] * src[4] + tmp[7] * src[6] + tmp[8]  * src[7]);
        m16[2] = (tmp[2] * src[4] + tmp[7] * src[5] + tmp[10] * src[7]) - (tmp[3] * src[4] + tmp[6] * src[5] + tmp[11] * src[7]);
        m16[3] = (tmp[5] * src[4] + tmp[8] * src[5] + tmp[11] * src[6]) - (tmp[4] * src[4] + tmp[9] * src[5] + tmp[10] * src[6]);
        m16[4] = (tmp[1] * src[1] + tmp[2] * src[2] + tmp[5]  * src[3]) - (tmp[0] * src[1] + tmp[3] * src[2] + tmp[4]  * src[3]);
        m16[5] = (tmp[0] * src[0] + tmp[7] * src[2] + tmp[8]  * src[3]) - (tmp[1] * src[0] + tmp[6] * src[2] + tmp[9]  * src[3]);
        m16[6] = (tmp[3] * src[0] + tmp[6] * src[1] + tmp[11] * src[3]) - (tmp[2] * src[0] + tmp[7] * src[1] + tmp[10] * src[3]);
        m16[7] = (tmp[4] * src[0] + tmp[9] * src[1] + tmp[10] * src[2]) - (tmp[5] * src[0] + tmp[8] * src[1] + tmp[11] * src[2]);

        // calculate pairs for second 8 elements (cofactors)
        tmp[0]  = src[2] * src[7];
        tmp[1]  = src[3] * src[6];
        tmp[2]  = src[1] * src[7];
        tmp[3]  = src[3] * src[5];
        tmp[4]  = src[1] * src[6];
        tmp[5]  = src[2] * src[5];
        tmp[6]  = src[0] * src[7];
        tmp[7]  = src[3] * src[4];
        tmp[8]  = src[0] * src[6];
        tmp[9]  = src[2] * src[4];
        tmp[10] = src[0] * src[5];
        tmp[11] = src[1] * src[4];

        // calculate second 8 elements (cofactors)
        m16[8]  = (tmp[0]  * src[13] + tmp[3]  * src[14] + tmp[4]  * src[15]) - (tmp[1]  * src[13] + tmp[2]  * src[14] + tmp[5]  * src[15]);
        m16[9]  = (tmp[1]  * src[12] + tmp[6]  * src[14] + tmp[9]  * src[15]) - (tmp[0]  * src[12] + tmp[7]  * src[14] + tmp[8]  * src[15]);
        m16[10] = (tmp[2]  * src[12] + tmp[7]  * src[13] + tmp[10] * src[15]) - (tmp[3]  * src[12] + tmp[6]  * src[13] + tmp[11] * src[15]);
        m16[11] = (tmp[5]  * src[12] + tmp[8]  * src[13] + tmp[11] * src[14]) - (tmp[4]  * src[12] + tmp[9]  * src[13] + tmp[10] * src[14]);
        m16[12] = (tmp[2]  * src[10] + tmp[5]  * src[11] + tmp[1]  * src[9])  - (tmp[4]  * src[11] + tmp[0]  * src[9]  + tmp[3]  * src[10]);
        m16[13] = (tmp[8]  * src[11] + tmp[0]  * src[8]  + tmp[7]  * src[10]) - (tmp[6]  * src[10] + tmp[9]  * src[11] + tmp[1]  * src[8]);
        m16[14] = (tmp[6]  * src[9]  + tmp[11] * src[11] + tmp[3]  * src[8])  - (tmp[10] * src[11] + tmp[2]  * src[8]  + tmp[7]  * src[9]);
        m16[15] = (tmp[10] * src[10] + tmp[4]  * src[8]  + tmp[9]  * src[9])  - (tmp[8]  * src[9]  + tmp[11] * src[10] + tmp[5]  * src[8]);

        // calculate determinant
        float det = src[0]*m16[0]+src[1]*m16[1]+src[2]*m16[2]+src[3]*m16[3];

        // calculate matrix inverse
        float invdet = 1 / det;
        for ( int j=0; j<16; ++j )
        {
            m16[j] *= invdet;
        }
    }

    return det;

}
示例#11
0
	JMatrix JMatrix::GetInverse()
	{
		/*
		역행렬(Inverse Matrix)
		어떤 행렬 A에 대하여 다음과 같은 성질을 만족하는 행렬 B를 일컫는다.
		AB = BA = I
		
		성질
		**역행렬을 가지는 행렬을 A라 하자.
		A는 가역행렬이다.
		AB = I 를 만족하는 정사각행렬 B가 존재함.
		Ax = 0의 해는 오직 x = 0일 뿐이다.
		Ax = b의 해가 임의의 b에 대해 유일하게 단 하나 존재한다.
		A^T * A의 행렬이 가역행렬이다.(A^T = A의 전치행렬, GetTranspose 함수 구현에서 자세히 설명한다)
		A의 행렬식은 0이 될 수 없다.
		A의 역행렬에 다시 역행렬을 취하면 자기자신이 됨.
		(kA)^-1 = k^-1 * A^-1 (k는 임의의 스칼라)
		두 가역행렬의 곱 A * B는 가역행렬이다.
		(AB)^-1 = B^-1 * A^-1
		
		역행렬 구하기
		여기선 크래머의 법칙을 이용한다.
		참고 : Streaming SIMD Extensions - Inverse of 4x4 Matrix (Intel.com)
		(http://download.intel.com/design/PentiumIII/sml/24504301.pdf)
		우선 C로 구현후 나중에 SIMD 버전으로 구현해보자.

		**여인자 전개?
		정사각행렬 A에서 i행과 j열을 제거하여 만든 부분행렬을 A(i | j) 라 하고
		det A(i | j) = | A(i | j) |를 A(i,j)의 소행렬식이라 한다.
		이 때 A'(i,j) = (-1)^(i+j) * | A(i | j) | 를 A(i,j)의 여인자라 한다.

		구현 방법
		1. 주어진 행렬의 전치행렬을 구한다.
		2. 모든 행렬의 원소들의 여인자(cofactor)를 구한다.
		   이 여인자들로 이루어진 새로운 행렬로 연산을 계속 진행한다.
		3. 2.에서 구한 행렬의 행렬식(determinant)을 구한다.
		4. 2.에서 구한 행렬과 3.에서 구한 행렬식 값을 곱한다.
		*/

		JMatrix matCopy = *this;

		//행렬식이 0이면 역행렬은 정의되지 않는다. 
		if (GetDeterminant() == 0.f)
		{
			matCopy.SetZero();
			return matCopy;
		}

		//주어진 행렬의 전치행렬 구하기.
		matCopy = this->GetTranspose();

		//주어진 행렬의 모든 원소들에 대한 여인자(cofactor)구하기
		JMatrix result(false);
		float tmp[12];

		//처음 두 행(m11 ~ m24)에 대한 여인자 구하기
		tmp[0] = matCopy.item_arr[10] * matCopy.item_arr[15];
		tmp[1] = matCopy.item_arr[11] * matCopy.item_arr[14];
		tmp[2] = matCopy.item_arr[9] * matCopy.item_arr[15];
		tmp[3] = matCopy.item_arr[11] * matCopy.item_arr[13];
		tmp[4] = matCopy.item_arr[9] * matCopy.item_arr[14];
		tmp[5] = matCopy.item_arr[10] * matCopy.item_arr[13];
		tmp[6] = matCopy.item_arr[8] * matCopy.item_arr[15];
		tmp[7] = matCopy.item_arr[11] * matCopy.item_arr[12];
		tmp[8] = matCopy.item_arr[8] * matCopy.item_arr[14];
		tmp[9] = matCopy.item_arr[10] * matCopy.item_arr[12];
		tmp[10] = matCopy.item_arr[8] * matCopy.item_arr[13];
		tmp[11] = matCopy.item_arr[9] * matCopy.item_arr[12];

		result.item_arr[0] = tmp[0] * matCopy.item_arr[5] + tmp[3] * matCopy.item_arr[6] + tmp[4] * matCopy.item_arr[7];
		result.item_arr[0] -= tmp[1] * matCopy.item_arr[5] + tmp[2] * matCopy.item_arr[6] + tmp[5] * matCopy.item_arr[7];
		result.item_arr[1] = tmp[1] * matCopy.item_arr[4] + tmp[6] * matCopy.item_arr[6] + tmp[9] * matCopy.item_arr[7];
		result.item_arr[1] -= tmp[0] * matCopy.item_arr[4] + tmp[7] * matCopy.item_arr[6] + tmp[8] * matCopy.item_arr[7];
		result.item_arr[2] = tmp[2] * matCopy.item_arr[4] + tmp[7] * matCopy.item_arr[5] + tmp[10] * matCopy.item_arr[7];
		result.item_arr[2] -= tmp[3] * matCopy.item_arr[4] + tmp[6] * matCopy.item_arr[5] + tmp[11] * matCopy.item_arr[7];
		result.item_arr[3] = tmp[5] * matCopy.item_arr[4] + tmp[8] * matCopy.item_arr[5] + tmp[11] * matCopy.item_arr[6];
		result.item_arr[3] -= tmp[4] * matCopy.item_arr[4] + tmp[9] * matCopy.item_arr[5] + tmp[10] * matCopy.item_arr[6];
		result.item_arr[4] = tmp[1] * matCopy.item_arr[1] + tmp[2] * matCopy.item_arr[2] + tmp[5] * matCopy.item_arr[3];
		result.item_arr[4] -= tmp[0] * matCopy.item_arr[1] + tmp[3] * matCopy.item_arr[2] + tmp[4] * matCopy.item_arr[3];
		result.item_arr[5] = tmp[0] * matCopy.item_arr[0] + tmp[7] * matCopy.item_arr[2] + tmp[8] * matCopy.item_arr[3];
		result.item_arr[5] -= tmp[1] * matCopy.item_arr[0] + tmp[6] * matCopy.item_arr[2] + tmp[9] * matCopy.item_arr[3];
		result.item_arr[6] = tmp[3] * matCopy.item_arr[0] + tmp[6] * matCopy.item_arr[1] + tmp[11] * matCopy.item_arr[3];
		result.item_arr[6] -= tmp[2] * matCopy.item_arr[0] + tmp[7] * matCopy.item_arr[1] + tmp[10] * matCopy.item_arr[3];
		result.item_arr[7] = tmp[4] * matCopy.item_arr[0] + tmp[9] * matCopy.item_arr[1] + tmp[10] * matCopy.item_arr[2];
		result.item_arr[7] -= tmp[5] * matCopy.item_arr[0] + tmp[8] * matCopy.item_arr[1] + tmp[11] * matCopy.item_arr[2];

		//다음 두 행(m31 ~ m44)에 대한 여인자 구하기
		tmp[0] = matCopy.item_arr[2] * matCopy.item_arr[7];
		tmp[1] = matCopy.item_arr[3] * matCopy.item_arr[6];
		tmp[2] = matCopy.item_arr[1] * matCopy.item_arr[7];
		tmp[3] = matCopy.item_arr[3] * matCopy.item_arr[5];
		tmp[4] = matCopy.item_arr[1] * matCopy.item_arr[6];
		tmp[5] = matCopy.item_arr[2] * matCopy.item_arr[5];
		tmp[6] = matCopy.item_arr[0] * matCopy.item_arr[7];
		tmp[7] = matCopy.item_arr[3] * matCopy.item_arr[4];
		tmp[8] = matCopy.item_arr[0] * matCopy.item_arr[6];
		tmp[9] = matCopy.item_arr[2] * matCopy.item_arr[4];
		tmp[10] = matCopy.item_arr[0] * matCopy.item_arr[5];
		tmp[11] = matCopy.item_arr[1] * matCopy.item_arr[4];

		result.item_arr[8] = tmp[0] * matCopy.item_arr[13] + tmp[3] * matCopy.item_arr[14] + tmp[4] * matCopy.item_arr[15];
		result.item_arr[8] -= tmp[1] * matCopy.item_arr[13] + tmp[2] * matCopy.item_arr[14] + tmp[5] * matCopy.item_arr[15];
		result.item_arr[9] = tmp[1] * matCopy.item_arr[12] + tmp[6] * matCopy.item_arr[14] + tmp[9] * matCopy.item_arr[15];
		result.item_arr[9] -= tmp[0] * matCopy.item_arr[12] + tmp[7] * matCopy.item_arr[14] + tmp[8] * matCopy.item_arr[15];
		result.item_arr[10] = tmp[2] * matCopy.item_arr[12] + tmp[7] * matCopy.item_arr[13] + tmp[10] * matCopy.item_arr[15];
		result.item_arr[10] -= tmp[3] * matCopy.item_arr[12] + tmp[6] * matCopy.item_arr[13] + tmp[11] * matCopy.item_arr[15];
		result.item_arr[11] = tmp[5] * matCopy.item_arr[12] + tmp[8] * matCopy.item_arr[13] + tmp[11] * matCopy.item_arr[14];
		result.item_arr[11] -= tmp[4] * matCopy.item_arr[12] + tmp[9] * matCopy.item_arr[13] + tmp[10] * matCopy.item_arr[14];
		result.item_arr[12] = tmp[2] * matCopy.item_arr[10] + tmp[5] * matCopy.item_arr[11] + tmp[1] * matCopy.item_arr[9];
		result.item_arr[12] -= tmp[4] * matCopy.item_arr[11] + tmp[0] * matCopy.item_arr[9] + tmp[3] * matCopy.item_arr[10];
		result.item_arr[13] = tmp[8] * matCopy.item_arr[11] + tmp[0] * matCopy.item_arr[8] + tmp[7] * matCopy.item_arr[10];
		result.item_arr[13] -= tmp[6] * matCopy.item_arr[10] + tmp[9] * matCopy.item_arr[11] + tmp[1] * matCopy.item_arr[8];
		result.item_arr[14] = tmp[6] * matCopy.item_arr[9] + tmp[11] * matCopy.item_arr[11] + tmp[3] * matCopy.item_arr[8];
		result.item_arr[14] -= tmp[10] * matCopy.item_arr[11] + tmp[2] * matCopy.item_arr[8] + tmp[7] * matCopy.item_arr[9];
		result.item_arr[15] = tmp[10] * matCopy.item_arr[10] + tmp[4] * matCopy.item_arr[8] + tmp[9] * matCopy.item_arr[9];
		result.item_arr[15] -= tmp[8] * matCopy.item_arr[9] + tmp[11] * matCopy.item_arr[10] + tmp[5] * matCopy.item_arr[8];

		//새로 만든 행렬의 행렬식 구하기
		float det = matCopy.item_arr[0] * result.item_arr[0] + matCopy.item_arr[1] * result.item_arr[1] + matCopy.item_arr[2] * result.item_arr[2] + matCopy.item_arr[3] * result.item_arr[3];

		//곱한다!!
		if (det == 0.0f)
		{
			result.SetZero();
			return result;
		}

		det = 1.f / det;
		for (int k = 0; k < 16; ++k)
			result.item_arr[k] *= det;

		return result;
	}