728x90
반응형
사용자로부터 (n *n) 크기의 정방 행렬 두 개를 입력받은 후, 두 행렬의 곱(Matrix Multiplication) 출력
● 입력 : 정수 하나를 입력 받음
- 2를 입력하면, (2 * 2) 행렬 2개에 대한 정수를 입력해야하므로, 각각 4가지 원소, 즉 8개 입력
- 4를 입력하면, (4 * 4) 행렬 2개에 대한 정수를 입력해야하므로, 각각 16가지 원소, 즉 32개 입력
● 출력 : 입력한 두 행렬의 곱을 계산 후 출력
● 예시 입력
● 소스코드
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int num;
int sum_value = 0;
int temp = 0;
int **arr;
printf("행렬의 크기 (n X n) => n : ");
scanf("%d", &num);
arr = (int**)malloc(sizeof(int*) * 2 );
for(int i = 0; i < num; i++)
{
arr[i] = (int*)malloc(sizeof(int) * (num*num) );
}
for(int i = 0; i < 2; i++) // 행렬 입력
{
for(int j = 0; j < (num*num); j++)
{
scanf("%d", &*((*(arr+i))+j));
}
}
for(int z = 0; z < (num*num);) // 행렬 곱
{
for(int i = 0; i < num; i++)
{
sum_value = 0;
temp = i;
for(int j = 0; j < num; j++)
{
sum_value += (arr[0][z + j] * arr[1][temp] );
temp += num;
}
printf("%3d ", sum_value);
}
z += num;
printf("\n");
}
for(int i=0; i < num; i++) // 메모리 해제
{
free(arr[i]);
}
free(arr);
return 0;
}
● 설명
메모리 할당을 배열로 보면 [2] X [(num*num)] 형태를 띄고 있습니다.
arr = (int**)malloc(sizeof(int*) * 2 );
for(int i = 0; i < num; i++)
{
arr[i] = (int*)malloc(sizeof(int) * (num*num) );
}
다음 코드를 아래 그림처럼 나타낼 수 있습니다.
저런식으로 입력을 받으면, 행렬 곱셈하기가 꽤나 까다로워집니다.
각 일차원 배열을 행렬처럼 생각해야 합니다.
따라서, 위 그림처럼 일차원 배열을 이차원처럼 동작되도록, 행렬 곱 한 것을 알 수 있습니다.
for(int z = 0; z < (num*num);) // 행렬 곱
{
for(int i = 0; i < num; i++)
{
sum_value = 0;
temp = i;
for(int j = 0; j < num; j++)
{
sum_value += (arr[0][z + j] * arr[1][temp] );
temp += num;
}
printf("%3d ", sum_value);
}
z += num;
printf("\n");
}
2차원 동적 메모리 할당에 대한 자세한 내용은 아래 링크를 확인해주세요.
2022.11.06 - [C언어] - [C언어] 2차원 동적 메모리 할당 - 공부하는 도비
반응형
'C Programming' 카테고리의 다른 글
문자열 비교 (strcmp) - 공부하는 도비 (0) | 2022.11.22 |
---|---|
C언어 문자열 길이 출력 (strlen) - 공부하는 도비 (0) | 2022.11.22 |
C언어 2차원 동적 메모리 할당 - 공부하는 도비 (0) | 2022.11.06 |
동적 메모리 할당을 통해 배열처럼 사용하기(mallloc(), calloc()) - 공부하는 도비 (0) | 2022.11.06 |
C언어 레지스터 변수 - 공부하는 도비 (0) | 2022.11.06 |