프로그래밍 언어/C

전치행렬 구하기(c언어)

fladi 2021. 7. 3. 06:06
728x90

전치행렬은 행과 열이 바뀐 행렬입니다. 

2차원 행렬을 사용할거고 함수로 받아야해서 동적할당을 이용할겁니다.

 

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

malloc을 사용해주기 위해 stdlib 인클루드 해줍니다.

 

int** Transpose_Mat(int *A, int n)
{
    int** arr = malloc(sizeof(int*) * n);
    for (int i = 0; i < n; i++)
        arr[i] = malloc(sizeof(int) * n);

    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
            arr[i][j] = A[3*i + j];
    }

    int** B = malloc(sizeof(int*) * n);
    for (int i = 0; i < n; i++)
        B[i] = malloc(sizeof(int) * n);

    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
            B[j][i] = arr[i][j];
    }
    
    return B;
}

좀 복잡해보여도 별 내용 없습니다.

맨 마지막 이중for문이 가장 핵심 내용이고, 나머지는 그냥 2차원 배열을 함수로 받아서 이용하기 위한 코드입니다.

arr을 행의 배열로 만들어주고, arr각각의 요소에 다시 동적할당을 해줘서 열의 역할을 하도록 만들었습니다.

간단한 그림설명

int main()
{
    int A[3][3] =
    {
        {1,2,3},
        {4,5,6},
        {7,8,9}
    };
    
    int** B = malloc(sizeof(int*) * 3);
    for (int i = 0; i < 3; i++)
        B[i] = B + i * 3;
    B = Transpose_Mat(A, 3);

    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 3; j++)
            printf("%d ", B[i][j]);
        printf("\n");
    }

    return 0;
}

메인에도 전치행렬 담기위한 B행렬을 동적할당으로 만들어줬습니다.

코드가 좀 복잡한 감이 있네요ㅠ

 

전체코드입니다.

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

int** Transpose_Mat(int *A, int n)
{
    int** arr = malloc(sizeof(int*) * n);
    for (int i = 0; i < n; i++)
        arr[i] = malloc(sizeof(int) * n);

    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
            arr[i][j] = A[3*i + j];
    }

    int** B = malloc(sizeof(int*) * n);
    for (int i = 0; i < n; i++)
        B[i] = malloc(sizeof(int) * n);

    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
            B[j][i] = arr[i][j];
    }
    
    return B;
}

int main()
{
    int A[3][3] =
    {
        {1,2,3},
        {4,5,6},
        {7,8,9}
    };
    
    int** B = malloc(sizeof(int*) * 3);
    for (int i = 0; i < 3; i++)
        B[i] = B + i * 3;
    B = Transpose_Mat(A, 3);

    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 3; j++)
            printf("%d ", B[i][j]);
        printf("\n");
    }

    return 0;
}
728x90