사용자 삽입 이미지



#include <iostream>
#include <iomanip>
#include <cmath>

using namespace std;

// 피보팅을 처리하는 함수 구현
void pivoting(double **matrix, int currentRow, int currentCol, int rowSize, int colSize){
 double *temp;
 temp =  new double[colSize];

 double max = fabs(matrix[currentRow][currentCol]); // 우선 현재행,현재열 값을 최대값으로 지정
 
 for(int i=currentRow+1; i<rowSize; i++){
  if(fabs(matrix[i][currentCol]) > max){
   temp = matrix[currentRow];
   matrix[currentRow] = matrix[i];
   matrix[i] = temp;
   max = matrix[currentRow][currentCol];
  }
 }
}

// 임의 크기의 행렬의 가우시안소거법 함수 구현
void gaussianElimination(double **matrix, int rowSize, int colSize){
 double temp;
 int i,j,k;

 pivoting(matrix,0,0,rowSize,colSize);

 for(i=0; i<rowSize-1; i++){
  for(j=i+1; j<rowSize; j++){

   pivoting(matrix,i,i,rowSize,colSize);

   temp = matrix[j][i] / matrix[i][i];
   for(k=0; k<colSize; k++){
     matrix[j][k] = matrix[j][k] - matrix[i][k]*temp;
   }
  }
 }

}

// 역행렬이 존재하는지 확인하는 함수 구현
int existINV(double **matrix, int size){
 double temp = 1.0;
 gaussianElimination(matrix, size, 2*size);
 for(int i=0; i<size; i++){ // 가우시안 소거법으로 상삼각 행렬을 만든후 대각요소의 곱을 구함
  temp *= matrix[i][i];
 }
 if(temp != 0) // 대각곱이 0이 아니면 역행렬이 존재하고 0이면 역행렬이 존재하지 않는다
  return 1;
 else
  return 0;
}

// 역행렬을 구하는 함수 구현
void solveInverse(double **matrix, int size, double **inv){
 for(int i=0; i<size; i++){ // 열의 인덱스
  inv[size-1][i] = matrix[size-1][size+i] / matrix[size-1][size-1];
  for(int j=size-2; j>=0; j--){
   double temp = 0.0;
   for(int k=size-1; k>j; k--){
    temp += (matrix[j][k]*inv[k][i]);
   }
   inv[j][i] = (matrix[j][size+i]-temp) / matrix[j][j];
  }
 }
}

// n x n 크기의 행렬을 저장하기 위한 함수 구현
void enter_nxn_Matrix(double **matrix, int size){
 for(int i=0; i<size; i++){
  cout << i+1 << "행의 값들을 넣어주세요 (예) 2 4 5 3 ... -> ";
  for(int j=0; j<size; j++){
   cin >> matrix[i][j];
  }
 }
 for(i=0; i<size; i++){
  for(int j=size; j<2*size; j++){
   if((i+size) == j)
    matrix[i][j] = 1;
   else
    matrix[i][j] = 0;
  }
 }
}

// 임의 크기의 행렬을 출력하는 함수 구현
void showMatrix(double **matrix, int rowSize, int colSize){
 cout << endl << "< 입력하신 행렬의 역행렬은 다음과 같습니다 >" << endl;
 for(int i=0; i<rowSize; i++){
  cout << endl;
 
  if(i==0) cout << "┏";
  else if(i==rowSize-1) cout << "┗";
  else cout << "┃";

  for(int j=0; j<colSize; j++){
   cout << setw(12) << matrix[i][j];
  }

  if(i==0) cout << " ┓";
  else if(i==rowSize-1) cout << " ┛";
  else cout << " ┃";
 }
 cout << endl << endl;
}

int main(){
 double **matrix, **inv;
 int size;

 cout << "n by n 행렬의 크기 n 값을 넣어주세요 (예) 5 -> ";
 cin >> size;
 
 matrix = new double*[size];
 inv = new double*[size];
 for(int i=0; i < size; i++){
  matrix[i] = new double [size*2];
  inv[i] = new double [size];
 }

 enter_nxn_Matrix(matrix, size);
 //showMatrix(matrix, size, size);
 if(!existINV(matrix, size)){
  cout << endl << "< 역행렬이 존재하지 않는 행렬이므로 프로그램을 종료합니다 >" << endl;
  return 0;
 }
 //showMatrix(matrix, size, 2*size);
 solveInverse(matrix,size,inv);
 showMatrix(inv, size, size);
 return 1;
}

출처 : Tong - 흔하지않은사람님의 c/c++통

'알고리즘 > 이미지 처리' 카테고리의 다른 글

Cubic B-Splines from wikipeda ...  (0) 2008.03.06
B-Spline을 활용하는 이미지 와핑 관련...  (0) 2008.03.06
역행렬 구하기  (0) 2008.03.05
이중선형 필터링  (0) 2008.03.05
Perspective projection matrix  (0) 2008.03.05
다각형을 가져오기 위한 노력...  (0) 2008.03.04

+ Recent posts