카테고리 없음
(C언어/행렬) 동적 메모리를 이용한 M by N 전치행렬 구현
미친토끼
2021. 2. 27. 23:34
// M by N 행렬을 전치(transpose)한다.
// static 배열을 사용하지 않고 main에서 동적 메모리를 할당하여 그 주소를 전치 함수에게 넘기면,
// 전치함수는 그 주소의 데이터를 전치하여 변경된 값들의 주소를 되넘긴다.
// 이렇게 하는 이유는 전치 함수를 범용으로 사용할 수 있도록 하기 위해서다.
// static 2차원 배열을 넘길 경우에는 함수의 2차원 배열 인자에 col의 갯수를 명시해야 해서, 범용 함수가 되지 못하기 때문이다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void printMatrix(int *array[], int row, int col) {
int i, j;
for (i = 0; i < row; i++) {
for (j = 0; j < col; j++)
printf("%d\t", array[i][j]);
printf("\n");
}
}
// M by N 행렬을 전치(transpose)한다.
// *origianl[] : 전치할 대상 *transpose[] : 전치해서 저장할 곳
// row: 행 col: 열
void transposeMbyN(int *original[], int *transposed[], int row, int col) {
int i, j, count = 0;
for (i = 0; i < row; i++) {
for (j = 0; j < col; j++) {
transposed[j][i] = original[i][j]; // 행과 열 인덱스를 바꾸어 저장.
count++;
}
}
printf("%d개의 원소를 전치했습니다.\n", count);
}
int main() {
const int row = 3;
const int col = 4;
int **original = NULL;
int **transposed = NULL;
int i, j;
int array[3][4] = { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12} };
// original matrix를 위한 동적 메모리 할당
// 첫 할당은 int * row개 : row의 데이터 배열을 가리키기 위한 것
// 두번째 할당은 int 형 col개 : 실제 데이터 저장을 위한 것
original = (int **)calloc(row, sizeof(int *));
for (i = 0; i < row; i++) {
original[i] = (int *)calloc(col, sizeof(int));
for (j = 0; j < col; j++)
original[i][j] = array[i][j];
}
printMatrix(original, 3, 4);
// transpose된 데이터를 저장하기 위한 동적 메모리 할당;
// 할당하는 col과 row 개수가 original matrix의 그것과 뒤바뀐다. 전치된 shape을 따라가야 하기 때문이다.
transposed = (int **)calloc(col, sizeof(int *));
for (i = 0; i < col; i++)
transposed[i] = (int *)calloc(row, sizeof(int));
//printMatrix(transposed, 4, 3);
printf("-------------------------------\n");
transposeMbyN(original, transposed, 3, 4);
printMatrix(transposed, 4, 3);
//할당 받은 original 메모리 해제
for (i = 0; i < row; i++)
free(original[i]);
free(original);
// 할당 받은 transposed 메모리 해제
for (i = 0; i < col; i++)
free(transposed[i]);
free(transposed);
return 0;
}
------------출력 결과---------
1 2 3 4
5 6 7 8
9 10 11 12
-------------------------------
12개의 원소를 전치했습니다.
1 5 9
2 6 10
3 7 11
4 8 12