티스토리 뷰
반응형
직접 수식을 이용하여 역행렬을 계산하는 알고리즘.
행렬크기가 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;
}
}
'Algorithm' 카테고리의 다른 글
3차 방정식 해를 구하는 공식 방법 (0) | 2024.01.18 |
---|---|
다각형 면적, 무게중심, 단면2차모멘트 계산 알고리즘 (0) | 2021.11.28 |
역행렬 (가우스 소거법) (0) | 2021.05.12 |
댓글