Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C++ 프로그램으로 행렬이 반대칭 행렬(Skew-Symmetric Matrix)인지 확인하는 방법

반대칭 행렬(Skew-Symmetric Matrix)이란?

정사각 행렬 A의 모든 원소에 대해 aij = −aji가 성립할 때, 행렬 A를 반대칭 행렬(skew-symmetric matrix)이라고 부릅니다. 다시 말해, 행렬 A의 전치행렬(transpose)이 원래 행렬의 음수와 같을 때, 즉 AT = −A가 성립하면 행렬 A는 반대칭 행렬입니다.

반대칭 행렬에는 한 가지 중요한 특징이 있습니다. 바로 주대각선(main diagonal)의 모든 원소가 반드시 0이라는 점입니다.

반대칭 행렬 예시

A = | 0  -5   4 |
    | 5   0  -1 |
    |-4   1   0 |

위 행렬은 모든 i, j에 대해 aij = −aji가 성립하므로 반대칭 행렬입니다. 예를 들어 a12 = -5이고 a21 = 5이므로 a12 = −a21이 되며, 나머지 모든 원소 쌍에서도 동일한 조건이 만족됩니다.

전치행렬을 직접 구해 확인해 볼 수도 있습니다.

AT = | 0   5  -4 |
      |-5   0   1 |
      | 4  -1   0 |

A  = | 0  -5   4 |
     | 5   0  -1 |
     |-4   1   0 |

AT = −A임을 명확하게 확인할 수 있으며, 따라서 행렬 A는 반대칭 행렬입니다.

프로그램 실행 결과 예시

입력:
행과 열의 개수 입력: 2 2
행렬의 원소 입력: 0 -5 5 0
출력:
The matrix is skew symmetric.
0 -5
5 0

동작 원리 및 알고리즘

행렬이 자기 자신의 전치행렬과 같으면 대칭 행렬(symmetric matrix)입니다. 만약 전치행렬이 자기 자신의 음수와 같다면 반대칭 행렬(skew-symmetric matrix)이며, 두 조건을 모두 만족하지 않으면 어느 쪽에도 해당하지 않습니다. 프로그램은 검사 결과에 따라 적절한 메시지를 출력합니다.

행렬 검사 절차

  • 사용자에게 행렬의 행과 열 개수를 입력받습니다.
  • 행렬의 각 원소를 입력받아 배열 'A'에 저장하고, 임시 변수 'x'와 'y'를 0으로 초기화합니다.
  • 행렬이 자신의 전치행렬과 같지 않으면(대칭이 아니면) 변수 'x'에 1을 대입합니다.
  • 행렬의 음수가 전치행렬과 같으면(반대칭이면) 변수 'y'에 1을 대입합니다.
  • x가 0이면 행렬은 대칭 행렬이고, y가 1이면 행렬은 반대칭 행렬입니다.
  • 두 조건 중 어느 것도 만족하지 않으면 행렬은 대칭도 반대칭도 아닙니다.
  • 최종 검사 결과를 화면에 출력합니다.

C++ 예제 코드

#include<iostream>
using namespace std;
int main () {
    int A[10][10], i, j, m, n, x = 0, y = 0;
    cout << "Enter the number of rows and columns : ";
    cin >> m >> n;
    cout << "Enter the matrix elements : ";
    for (i = 0; i < m; i++)
        for (j = 0; j < n; j++)
            cin >> A[i][j];
    for (i = 0; i < m; i++) {
        for (j = 0; j < n; j++) {
            if (A[i][j] != A[j][i])
                x = 1;
            else if (A[i][j] == -A[j][i])
                y = 1;
        }
    }
    if (x == 0)
        cout << "The matrix is symmetric.\n";
    else if (y == 1)
        cout << "The matrix is skew symmetric.\n";
    else
        cout << "It is neither symmetric nor skew-symmetric.\n";
    for (i = 0; i < m; i++) {
        for (j = 0; j < n; j++)
            cout << A[i][j] << " ";
        cout << "\n";
    }
    return 0;
}

이 코드는 먼저 사용자로부터 행렬의 크기와 원소를 입력받은 뒤, 이중 반복문을 통해 모든 원소 쌍 A[i][j]와 A[j][i]를 비교하여 대칭 여부와 반대칭 여부를 판별합니다. 마지막으로 검사 결과와 함께 입력된 행렬을 화면에 출력합니다.