티스토리 뷰

Algorithm

2X2 3X3 역행렬 계산

마구자바 2021. 5. 12. 23:38
반응형

직접 수식을 이용하여 역행렬을 계산하는 알고리즘.

행렬크기가 2X2이거나 3X3일때는 다음을 이용하여 계산하면 빠르게 구할 수 있다.

소스코드는 Javascript를 이용한 것이므로,

다른 프로그램을 이용할 경우는 해당 프로그램의 문법에 맞춰 수정해야한다.

 

 

 

 

if( mat.length == 2 ){
		
		det = mat[0][0] * mat[1][1] - mat[1][0] * mat[0][1];
		
		if( det == 0 ){
			
			alert( "matrix is singular!");
			
		} else {
			
			minv = [];
			minv.push( [ mat[1][1] / det, -1*mat[0][1] / det ] );
			minv.push( [ -1* mat[1][0] / det, mat[0][0] /det ] );
			
			return minv;
		}
		
} else if ( mat.length == 3 ){
		
		 det = 		mat[0][0] * ( mat[1][1] * mat[2][2] - mat[1][2] * mat[2][1]  )
					-	mat[0][1] * ( mat[1][0] * mat[2][2] - mat[1][2] * mat[2][0]  )
					+	mat[0][2] * ( mat[1][0] * mat[2][1] - mat[1][1] * mat[2][0]  );
​
		if( det == 0 ){
			
			alert( "matrix is singular!");
			
		} else {
			
			minv = [];
			
			// transpose
			dtem = mat[0][1];
			mat[0][1] = mat[1][0];
			mat[1][0]= dtem;
​
			dtem = mat[0][2];
			mat[0][2] = mat[2][0];
			mat[2][0]= dtem;
​
			dtem = mat[1][2];
			mat[1][2] = mat[2][1];
			mat[2][1]= dtem;
			
			minv.push( [( mat[1][1] * mat[2][2] - mat[1][2] * mat[2][1] ) / det, -1*( mat[1][0] * mat[2][2] - mat[1][2] * mat[2][0] ) / det, ( mat[1][0] * mat[2][1] - mat[1][1] * mat[2][0] ) / det ] );			
            minv.push( [ -1*( mat[0][1] * mat[2][2] - mat[0][2] * mat[2][1] ) / det, ( mat[0][0] * mat[2][2] - mat[0][2] * mat[2][0] ) / det, -1*( mat[0][0] * mat[2][1] - mat[0][1] * mat[2][0] ) / det ] );
			minv.push( [ ( mat[0][1] * mat[1][2] - mat[0][2] * mat[1][1] ) / det, -1*( mat[0][0] * mat[1][2] - mat[0][2] * mat[1][0] ) / det, ( mat[0][0] * mat[1][1] - mat[0][1] * mat[1][0] ) / det ] );
			
			return minv;
		}
}

 

 

 

 

 

댓글