C++의 역행렬

Adnan Ashraf 2023년10월12일
  1. 행렬의 역함수
  2. 3x3 행렬에 대한 역의 C++ 구현
C++의 역행렬

이 기사에서는 역행렬과 C++를 사용한 구현에 대해 설명합니다. C++ 구현을 쉽게 이해하려면 먼저 역행렬의 개념을 이해해야 합니다.

행렬의 역함수

행렬의 역행렬을 찾는 데는 세 단계가 있습니다. 단계에 대한 설명은 다음과 같습니다.

  • 첫 번째 단계에서 주어진 행렬의 행렬식을 계산합니다.
  • 두 번째 단계에서 결정자가 0이 아닌 경우 주어진 행렬의 adjoint를 계산합니다.
  • 마지막으로 2단계에서 얻은 행렬에 1/determinant를 곱합니다.

역행렬의 수학 공식

S를 3 x 3 행렬이라고 합니다. 그러면 그 역함수를 구하는 공식은 아래와 같습니다.

$$ Inverse\; of\; Matrix\; S\;= S^{-1}=\frac{1}{\operatorname{determinant}(S)} \operatorname{adjoint}(S) $$

참고: 주어진 행렬의 결정자가 영(0)인 경우, 즉 행렬이 특이 행렬인 경우 역행렬을 찾을 수 없습니다.

다음은 C++에서 3x3 차수의 역행렬을 찾는 프로그램입니다. 단순성을 위해 행렬을 저장하기 위해 배열을 사용했습니다.

프로그램은 특이 행렬이 아닌 경우에만 행렬의 역행렬을 찾습니다. 다음 속성으로 답을 확인할 수 있습니다.

$$ S.S^{-1}=I $$

여기서 I는 대각선에 항목이 1인 항등 행렬입니다. 위의 속성이 성립한다면 우리의 대답은 참이 될 것입니다. 그렇지 않으면 거짓입니다.

제안된 프로그램은 모듈로 나뉩니다.

3x3 행렬에 대한 역의 C++ 구현

역행렬은 벡터, 템플릿 및 클래스를 사용하여 구현할 수 있습니다. 그러나 단순화를 위해 3x3 행렬의 역을 결정하기 위해 2D 배열을 사용합니다.

그런 다음 솔루션을 일반화하여 NxN 행렬의 역수를 찾을 수 있습니다.

프로그램의 구성 요소를 하나씩 설명하겠습니다.

주요 기능

int main()  // main function
{
  float matrix3X3[3][3];
  int r, c;
  float determinant = 0;
  for (r = 0; r < 3; r++) {
    for (c = 0; c < 3; c++) {
      cout << "Enter the value at index [" << r << "][" << c << "] : ";
      cin >> matrix3X3[r][c];
    }
  }
  display(matrix3X3);
  determinant = findDeterminant(matrix3X3);
  cout << "\n\nDeteterminant of the given matrix is : " << determinant;
  if (determinant != 0) {
    adjoint(matrix3X3);
    inverse(matrix3X3, determinant);
  } else {
    cout << " As the determinant of the given matrix is 0, so we cannot take "
            "find it's Inverse :";
  }
}

main 함수에서 역행렬을 찾을 수 있는 행렬을 만들었습니다. 그런 다음 조건부 검사를 적용하여 행렬이 특이인지 여부를 확인했습니다.

특이하지 않은 경우 행렬의 역행렬이 함수에 의해 계산됩니다. 다음은 우리가 만든 각 기능에 대한 설명입니다.

디스플레이 기능

void display(float matrix3X3[][3]) {
  printf("\nThe Elements of the matrix are :");
  for (int r = 0; r < 3; r++) {
    cout << "\n";
    for (int c = 0; c < 3; c++) {
      cout << matrix3X3[r][c] << "\t";
    }
  }
}

디스플레이 기능은 행렬을 표시하는 데 사용됩니다. 여기서 matrix3X3은 값을 표시할 행렬입니다.

행렬식 계산 함수

float findDeterminant(float matrix3X3[][3]) {
  float det = 0;  // here det is the determinant of the matrix.
  for (int r = 0; r < 3; r++) {
    det = det + (matrix3X3[0][r] *
                 (matrix3X3[1][(r + 1) % 3] * matrix3X3[2][(r + 2) % 3] -
                  matrix3X3[1][(r + 2) % 3] * matrix3X3[2][(r + 1) % 3]));
  }
  return det;
}

findDeterminant 함수는 행렬의 행렬식을 찾는 데 사용됩니다. 여기서 det는 행렬 matrix3X3 행렬식입니다.

행렬식을 본 후 행렬 역행렬이 가능한지 여부를 결론 지을 수 있습니다.

인접 기능

void adjoint(float matrix3X3[][3]) {
  cout << "\n\nAdjoint of matrix is: \n";
  for (int r = 0; r < 3; r++) {
    for (int c = 0; c < 3; c++) {
      cout << ((matrix3X3[(c + 1) % 3][(r + 1) % 3] *
                matrix3X3[(c + 2) % 3][(r + 2) % 3]) -
               (matrix3X3[(c + 1) % 3][(r + 2) % 3] *
                matrix3X3[(c + 2) % 3][(r + 1) % 3]))
           << "\t";
    }
    cout << endl;
  }
}

adjoint 함수는 행렬의 adjoint를 찾는 데 사용됩니다. adjoint 행렬을 찾은 후 행렬식의 역수를 곱하여 역행렬을 찾습니다.

역함수

void inverse(float matrix3X3[][3], float d) {
  cout << "\n\nInverse of matrix is: \n";
  for (int r = 0; r < 3; r++) {
    for (int c = 0; c < 3; c++) {
      cout << ((matrix3X3[(c + 1) % 3][(r + 1) % 3] *
                matrix3X3[(c + 2) % 3][(r + 2) % 3]) -
               (matrix3X3[(c + 1) % 3][(r + 2) % 3] *
                matrix3X3[(c + 2) % 3][(r + 1) % 3])) /
                  d
           << "\t";
    }
    cout << endl;
  }
}

마지막으로 inverse 함수는 행렬의 역함수를 계산하는 데 사용됩니다. 이 함수에서 adjoint 행렬의 각 항목은 역행렬을 찾기 위해 행렬식으로 나뉩니다.

이제 3x3 행렬의 역행렬에 대한 전체 코드를 살펴보겠습니다.

전체 C++ 프로그램

#include <iostream>
using namespace std;
void display(float matrix3X3[][3]) {
  printf("\nThe Elements of the matrix are :");
  for (int r = 0; r < 3; r++) {
    cout << "\n";
    for (int c = 0; c < 3; c++) {
      cout << matrix3X3[r][c] << "\t";
    }
  }
}
// This function will calculate the determinant of the given matrix
float findDeterminant(float matrix3X3[][3]) {
  float det = 0;  // here det is the determinant of the matrix.
  for (int r = 0; r < 3; r++) {
    det = det + (matrix3X3[0][r] *
                 (matrix3X3[1][(r + 1) % 3] * matrix3X3[2][(r + 2) % 3] -
                  matrix3X3[1][(r + 2) % 3] * matrix3X3[2][(r + 1) % 3]));
  }
  return det;
}
// This function will calculate the adjoint of the given matrix
void adjoint(float matrix3X3[][3]) {
  cout << "\n\nAdjoint of matrix is: \n";
  for (int r = 0; r < 3; r++) {
    for (int c = 0; c < 3; c++) {
      cout << ((matrix3X3[(c + 1) % 3][(r + 1) % 3] *
                matrix3X3[(c + 2) % 3][(r + 2) % 3]) -
               (matrix3X3[(c + 1) % 3][(r + 2) % 3] *
                matrix3X3[(c + 2) % 3][(r + 1) % 3]))
           << "\t";
    }
    cout << endl;
  }
}
// This function will find the Inverse of the given matrix
void inverse(float matrix3X3[][3], float d) {
  cout << "\n\nInverse of matrix is: \n";
  for (int r = 0; r < 3; r++) {
    for (int c = 0; c < 3; c++) {
      cout << ((matrix3X3[(c + 1) % 3][(r + 1) % 3] *
                matrix3X3[(c + 2) % 3][(r + 2) % 3]) -
               (matrix3X3[(c + 1) % 3][(r + 2) % 3] *
                matrix3X3[(c + 2) % 3][(r + 1) % 3])) /
                  d
           << "\t";
    }
    cout << endl;
  }
}
int main()  // main function
{
  float matrix3X3[3][3];
  int r, c;
  float determinant = 0;
  for (r = 0; r < 3; r++) {
    for (c = 0; c < 3; c++) {
      cout << "Enter the value at index [" << r << "][" << c << "] : ";
      cin >> matrix3X3[r][c];
    }
  }
  display(matrix3X3);
  determinant = findDeterminant(matrix3X3);
  cout << "\n\nDeteterminant of the given matrix is : " << determinant;
  if (determinant != 0) {
    adjoint(matrix3X3);
    inverse(matrix3X3, determinant);
  } else {
    cout << " As determinant of the given matrix is 0, so we cannot take find "
            "it's Inverse :";
  }
}

입력 행렬이 특이 행렬일 때 출력:

특이 행렬에 대한 출력

출력 결과는 행렬이 특이 행렬일 때 알고리즘이 역행렬을 계산하지 않는다는 것을 보여줍니다.

입력 행렬이 특이 행렬이 아닌 경우 출력:

비특이 행렬에 대한 출력

결과는 행렬이 비특이인 경우에만 알고리즘이 역함수를 계산함을 보여줍니다.