'determinant'에 해당 되는 글 1건
- 2010.01.20 n by n matrix의 determinant 구하기
n by n matrix의 determinant 구하기
/***************************************************************
* 기능 : 사용자로부터 square matrix의 크기와 성분들을 입력받아
* cofactor를 이용해determinant를 구함
* 입력 : square matrix의 크기, matrix의 성분들
* 출력 : 입력받은 matrix, matrix의 determinant*
*
* 작성일 : 09년 12월 07일
* 최종 수정일 : 09년 12월 07일
***************************************************************/
#include <stdio.h> //입출력을 위한 헤더파일
#include <stdlib.h> //dynamic memory 할당을 위한 헤더파일
#include <math.h> //x^n을 계산하는 pow함수를 이용하기 위한 헤더파일
void InputMat(double **mat, int size); //사용자로부터 matrix의 성분들을 입력받는 함수
void ShowMat(double **mat, int size); //사용자로부터 입력받은 matrix를 출력하는 함수
double DetMat(double **mat, int size); //matrix와 size를 입력받아 determinant를 반환하는 함수
double CofacMat(double **mat, int p, int q, int size); //matrix와 size, index를 입력받아 cofactor를 반환하는 함수
int main(void)
{
int size=2;
int i=0;
double **mat;
printf("Square matrix의 크기를 입력하세요 >>");
scanf_s("%d", &size);
//matrix의 dynamic memory 할당
mat = (double**)malloc( sizeof(double*) * size );
for (i=0 ; i<size ; i++) {
mat[i] = (double*)malloc( sizeof(double) * size );
}
InputMat(mat, size); //사용자로부터 matrix를 입력받음
ShowMat(mat, size); //입력받은 matrix를 출력함
printf("\nDeterminant = %.2lf\n", DetMat(mat, size));
//matrix의 dynamic memory 해제
for (i=0 ; i<size ; i++) {
free(mat[i]);
}
free(mat);
return 0;
}
void InputMat(double **mat, int size) {
int p=0, q=0;
for (p=0; p<size; p++) {
for (q=0; q<size; q++) {
printf("row %d, column %d의 성분을 입력해 주세요 >>", p+1, q+1);
scanf_s("%lf", &mat[p][q]);
}
}
}
void ShowMat(double **mat, int size) {
int p=0, q=0;
printf("matrix = \n");
for (p=0; p<size; p++) {
if (p == 0) {
printf("┌");
} else if(p == size-1) {
printf("└");
} else {
printf("│");
}
for (q=0; q<size; q++) {
printf(" %.2lf", mat[p][q]);
}
if (p == 0) {
printf(" ┐\n");
} else if(p == size-1) {
printf(" ┘\n");
} else {
printf(" │\n");
}
}
}
double DetMat(double **mat, int size) {
int p=0, q=0;
double det=0;
if (size == 1) { //determinant of 1 by 1 matrix
return mat[0][0];
} else if ( size == 2 ) { //determinant 2 by 2 matrix
return mat[0][0]*mat[1][1] - mat[0][1]*mat[1][0];
} else { //3 by 3 이상
for (q=0, det=0 ; q<size ; q++) {
det = det + mat[0][q]*CofacMat(mat, 0, q, size);
}
return det;
}
return 0;
}
double CofacMat(double **mat, int p, int q, int size) {
int i=0, j=0; //인자로 받은 matrix의 index
int x=0, y=0; //cmat의 index
double **cmat;
double cofactor=0;
//cofactor matrix의 dynamic memory 할당
cmat = (double**)malloc( sizeof(double*) * (size-1) );
for (i=0 ; i<(size-1) ; i++) {
cmat[i] = (double*)malloc( sizeof(double) * (size-1) );
}
//mat으로 부터 cmat추출(cmat은 mat의 p행과 q열의 원소를 제외한 나머지 원소들로 구성된 matrix)
for (i=0,x=0 ; i<size ; i++) {
if (i != p) {
for (j=0,y=0 ; j<size ; j++) {
if (j != q) {
cmat[x][y] = mat[i][j];
y++;
}
}
x++;
}
}
//cofactor를 계산
cofactor = pow(-1,p)*pow(-1,q)*DetMat(cmat,size-1);
//cofactor matrix의 dynamic memory 해제
for (i=0 ; i<(size-1) ; i++) {
free(cmat[i]);
}
free(cmat);
return cofactor;
}