C 언어로 행렬식 계산하기

CBeginner
지금 연습하기

소개

이 실습에서는 C 프로그래밍으로 정방 행렬의 행렬식을 계산하는 방법을 배웁니다. 이 실습은 다음 단계를 포함합니다: 행렬의 차원과 요소를 읽는 것, 재귀 또는 LU 분해 방법을 사용하여 행렬식을 계산하는 것, 그리고 최종 결과를 출력하는 것. 단계별 지침은 최대 10x10 크기의 정방 행렬을 처리할 수 있는 프로그램을 만드는 과정을 안내하며, 사용자는 행렬 요소를 동적으로 입력하고 계산된 행렬식을 표시할 수 있습니다.

차원 및 요소 읽기 (정방 행렬)

이 단계에서는 C 프로그래밍으로 정방 행렬의 차원과 요소를 읽는 방법을 배웁니다. 사용자가 행렬의 크기와 요소를 동적으로 입력할 수 있도록 프로그램을 만들 것입니다.

먼저 행렬식 프로그램을 위한 새로운 C 파일을 생성합니다.

cd ~/project
nano matrix_determinant.c

이제 행렬 차원과 요소를 읽는 다음 코드를 추가합니다.

#include <stdio.h>
#include <stdlib.h>

#define MAX_SIZE 10

int main() {
    int n, i, j;
    int matrix[MAX_SIZE][MAX_SIZE];

    // 행렬 차원 읽기
    printf("정방 행렬의 크기를 입력하세요 (1-%d): ", MAX_SIZE);
    scanf("%d", &n);

    // 행렬 크기 유효성 검사
    if (n < 1 || n > MAX_SIZE) {
        printf("잘못된 행렬 크기입니다. 1 과 %d 사이의 크기를 입력하세요.\n", MAX_SIZE);
        return 1;
    }

    // 행렬 요소 읽기
    printf("행렬 요소를 입력하세요:\n");
    for (i = 0; i < n; i++) {
        for (j = 0; j < n; j++) {
            printf("요소 [%d][%d] 를 입력하세요: ", i, j);
            scanf("%d", &matrix[i][j]);
        }
    }

    // 입력 확인을 위해 행렬 출력
    printf("\n입력된 행렬:\n");
    for (i = 0; i < n; i++) {
        for (j = 0; j < n; j++) {
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }

    return 0;
}

프로그램을 컴파일하고 실행합니다.

gcc matrix_determinant.c -o matrix_determinant
./matrix_determinant

예시 출력:

정방 행렬의 크기를 입력하세요 (1-10): 3
행렬 요소를 입력하세요:
요소 [0][0]를 입력하세요: 1
요소 [0][1]를 입력하세요: 2
요소 [0][2]를 입력하세요: 3
요소 [1][0]를 입력하세요: 4
요소 [1][1]를 입력하세요: 5
요소 [1][2]를 입력하세요: 6
요소 [2][0]를 입력하세요: 7
요소 [2][1]를 입력하세요: 8
요소 [2][2]를 입력하세요: 9

입력된 행렬:
1 2 3
4 5 6
7 8 9

코드 분석:

  • 과도한 메모리 할당을 방지하기 위해 최대 행렬 크기를 10 으로 정의합니다.
  • 프로그램은 먼저 사용자에게 행렬 크기를 입력하도록 요청합니다.
  • 입력값이 허용 범위 내에 있는지 확인합니다.
  • 그런 다음 사용자에게 각 행렬 요소를 개별적으로 입력하도록 요청합니다.
  • 마지막으로 입력된 행렬을 출력하여 입력을 확인합니다.

재귀 또는 LU 분해 방법 사용

이 단계에서는 행렬의 행렬식을 계산하기 위한 재귀 방법을 구현합니다. 이전 프로그램을 수정하여 행렬식 계산 함수를 포함할 것입니다.

matrix_determinant.c 파일을 업데이트합니다.

nano matrix_determinant.c

이전 내용을 다음 코드로 바꿉니다.

#include <stdio.h>
#include <stdlib.h>

#define MAX_SIZE 10

// 행렬식을 재귀적으로 계산하는 함수
int determinant(int matrix[MAX_SIZE][MAX_SIZE], int n) {
    int det = 0;
    int submatrix[MAX_SIZE][MAX_SIZE];

    // 1x1 행렬의 경우 기저 사례
    if (n == 1) {
        return matrix[0][0];
    }

    // 2x2 행렬의 경우 기저 사례
    if (n == 2) {
        return matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0];
    }

    // 더 큰 행렬의 경우 재귀 사례
    int sign = 1;
    for (int k = 0; k < n; k++) {
        // 부행렬 생성
        int subi = 0;
        for (int i = 1; i < n; i++) {
            int subj = 0;
            for (int j = 0; j < n; j++) {
                if (j == k) continue;
                submatrix[subi][subj] = matrix[i][j];
                subj++;
            }
            subi++;
        }

        // 재귀 계산
        det += sign * matrix[0][k] * determinant(submatrix, n - 1);
        sign = -sign;
    }

    return det;
}

int main() {
    int n, i, j;
    int matrix[MAX_SIZE][MAX_SIZE];

    // 행렬 차원 읽기
    printf("정방 행렬의 크기를 입력하세요 (1-%d): ", MAX_SIZE);
    scanf("%d", &n);

    // 행렬 크기 유효성 검사
    if (n < 1 || n > MAX_SIZE) {
        printf("잘못된 행렬 크기입니다. 1 과 %d 사이의 크기를 입력하세요.\n", MAX_SIZE);
        return 1;
    }

    // 행렬 요소 읽기
    printf("행렬 요소를 입력하세요:\n");
    for (i = 0; i < n; i++) {
        for (j = 0; j < n; j++) {
            printf("요소 [%d][%d] 를 입력하세요: ", i, j);
            scanf("%d", &matrix[i][j]);
        }
    }

    // 행렬식 계산 및 출력
    int det = determinant(matrix, n);
    printf("\n행렬의 행렬식: %d\n", det);

    return 0;
}

프로그램을 컴파일하고 실행합니다.

gcc matrix_determinant.c -o matrix_determinant
./matrix_determinant

예시 출력:

정방 행렬의 크기를 입력하세요 (1-10): 3
행렬 요소를 입력하세요:
요소 [0][0]를 입력하세요: 1
요소 [0][1]를 입력하세요: 2
요소 [0][2]를 입력하세요: 3
요소 [1][0]를 입력하세요: 4
요소 [1][1]를 입력하세요: 5
요소 [1][2]를 입력하세요: 6
요소 [2][0]를 입력하세요: 7
요소 [2][1]를 입력하세요: 8
요소 [2][2]를 입력하세요: 9

행렬의 행렬식: 0

재귀 행렬식 계산에 대한 주요 내용:

  • determinant() 함수는 재귀적 방법을 사용하여 행렬식을 계산합니다.
  • 1x1 및 2x2 행렬의 경우 직접 계산하는 기저 사례가 있습니다.
  • 더 큰 행렬의 경우 첫 번째 행을 따라 여인수 전개 방법을 사용합니다.
  • 함수는 부행렬을 생성하고 재귀적으로 그 행렬식을 계산합니다.

행렬식 출력

이 마지막 단계에서는 사용자 경험을 개선하기 위해 행렬식 프로그램에 더 자세한 출력과 오류 처리를 추가할 것입니다.

matrix_determinant.c 파일을 업데이트합니다.

nano matrix_determinant.c

이전 내용을 다음 개선된 코드로 바꿉니다.

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

#define MAX_SIZE 10

// 행렬식을 재귀적으로 계산하는 함수
int determinant(int matrix[MAX_SIZE][MAX_SIZE], int n) {
    int det = 0;
    int submatrix[MAX_SIZE][MAX_SIZE];

    // 1x1 행렬의 경우 기저 사례
    if (n == 1) {
        return matrix[0][0];
    }

    // 2x2 행렬의 경우 기저 사례
    if (n == 2) {
        return matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0];
    }

    // 더 큰 행렬의 경우 재귀 사례
    int sign = 1;
    for (int k = 0; k < n; k++) {
        // 부행렬 생성
        int subi = 0;
        for (int i = 1; i < n; i++) {
            int subj = 0;
            for (int j = 0; j < n; j++) {
                if (j == k) continue;
                submatrix[subi][subj] = matrix[i][j];
                subj++;
            }
            subi++;
        }

        // 재귀 계산
        det += sign * matrix[0][k] * determinant(submatrix, n - 1);
        sign = -sign;
    }

    return det;
}

// 행렬을 형식화하여 출력하는 함수
void print_matrix(int matrix[MAX_SIZE][MAX_SIZE], int n) {
    printf("\n행렬:\n");
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            printf("%5d ", matrix[i][j]);
        }
        printf("\n");
    }
}

int main() {
    int n, i, j;
    int matrix[MAX_SIZE][MAX_SIZE];
    bool valid_input = false;

    while (!valid_input) {
        // 행렬 차원 읽기
        printf("정방 행렬의 크기를 입력하세요 (1-%d): ", MAX_SIZE);
        if (scanf("%d", &n) != 1) {
            printf("잘못된 입력입니다. 숫자를 입력하세요.\n");
            while (getchar() != '\n'); // 입력 버퍼 비우기
            continue;
        }

        // 행렬 크기 유효성 검사
        if (n < 1 || n > MAX_SIZE) {
            printf("잘못된 행렬 크기입니다. 1 과 %d 사이의 크기를 입력하세요.\n", MAX_SIZE);
            continue;
        }

        valid_input = true;
    }

    // 행렬 요소 읽기
    printf("행렬 요소를 입력하세요:\n");
    for (i = 0; i < n; i++) {
        for (j = 0; j < n; j++) {
            printf("요소 [%d][%d] 를 입력하세요: ", i, j);
            while (scanf("%d", &matrix[i][j]) != 1) {
                printf("잘못된 입력입니다. 요소 [%d][%d] 에 정수를 입력하세요: ", i, j);
                while (getchar() != '\n'); // 입력 버퍼 비우기
            }
        }
    }

    // 입력 행렬 출력
    print_matrix(matrix, n);

    // 행렬식 계산 및 출력
    int det = determinant(matrix, n);

    // 형식화된 행렬식 출력
    printf("\n--- 행렬식 계산 ---\n");
    printf("행렬 차원: %d x %d\n", n, n);
    printf("행렬식: %d\n", det);

    return 0;
}

프로그램을 컴파일하고 실행합니다.

gcc matrix_determinant.c -o matrix_determinant
./matrix_determinant

예시 출력:

정방 행렬의 크기를 입력하세요 (1-10): 3
행렬 요소를 입력하세요:
요소 [0][0]를 입력하세요: 1
...
행렬:
    1     2     3
    4     5     6
    7     8     9

--- 행렬식 계산 ---
행렬 차원: 3 x 3
행렬식: 0

주요 개선 사항:

  • 잘못된 입력을 처리하기 위한 입력 유효성 검사 추가
  • 행렬을 더 나은 형식으로 출력하는 별도 함수 생성
  • 행렬 차원과 행렬식을 명확하게 보여주는 출력 개선
  • 사용자 입력에 대한 오류 처리 개선

요약

이 실험에서는 C 프로그래밍에서 정방 행렬의 차원과 요소를 읽는 방법을 배웠습니다. 사용자가 행렬의 크기와 요소를 동적으로 입력할 수 있도록 프로그램을 만들었습니다. 프로그램은 행렬 크기를 검증한 후 사용자에게 행렬 요소를 입력하도록 요청합니다. 마지막으로 입력된 행렬을 출력하여 입력을 확인합니다.

이 실험의 다음 단계에서는 입력 행렬의 행렬식을 계산하기 위해 재귀 또는 LU 분해 방법을 사용하는 방법과 행렬식을 출력하는 방법을 다룰 것입니다.