2010. 1. 20. 00:03

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;
}


사용자 삽입 이미지