행렬 X(4 X 2)와 Y(2 X 3)에 대해서 두 행렬의 곱(Z에 넣어서)을 구하여 출력하는 프로그램을 작성하시오.
X와 Y의 행렬원소의 값을 입력 받는다. 앞의 LAB에서 정의한 readMatrix 함수를 사용 할 수 있는가?
배열 Z에 행렬의 곱을 저장하여 출력한다
LAB에서 작성한 함수를 (가능하면)사용하고 일단 행렬곱을 계산하는 부분을 main에서 해 본 다(HW5a_1)
#include void printMatrix(int a[][3], int size)
{
}
void readMatrix(int a[][3], int size)
{
}
void readMatrix2(int a[][2], int size)
{
}
int main(void)
{
int X[4][2], Y[2][3], Z[4][3];
printf("(4 x 2) 행렬 X 입력:\n");
readMatrix2(X, 4);
printf("(2 x 3) 행렬 Y 입력:\n");
readMatrix(Y, 2);
// Z에 행렬곱을 넣는 코드(HW5a_1)
// 함수화는 나중에 해보자!(HW5a_2)
printf("행렬곱:\n");
printMatrix(Z, 4);
printf("\n");
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
void printMatrix(int a[][3], int size)
{
for (int i = 0; i < size; i++) {
for (int j = 0; j < 3; j++)
printf(" %d", a[i][j]);
printf("\n");
}
}
void readMatrix(int a[][3], int size)
{
for (int i = 0; i < size; i++)
for (int j = 0; j < 3; j++)
scanf("%d", &a[i][j]);
}
void readMatrix2(int a[][2], int size)
{
for (int i = 0; i < size; i++)
for (int j = 0; j < 2; j++)
scanf("%d", &a[i][j]);
}
int main(void)
{
int X[4][2], Y[2][3], Z[4][3];
printf("(4 x 2) 행렬 X 입력:\n");
readMatrix2(X, 4);
printf("(2 x 3) 행렬 Y 입력:\n");
readMatrix(Y, 2);
// Z에 행렬곱을 넣는 코드(HW5a_1)
for (int i = 0; i < 4; i++)
for (int j = 0; j < 3; j++)
Z[i][j] = X[i][0] * Y[0][j] + X[i][1] * Y[1][j];
printf("행렬곱:\n");
printMatrix(Z, 4);
printf("\n");
}
|
cs |
x
00 01
y
00 10
x y x y
00=00*00+01*10
x y x y
01=00*01+01*11
x y x y
10=10*00+11*10
x y x y
02=00*02+01*12
x y x y
32=30*02+31*12
z의 인덱스를 x와 y의 인덱스로 표현해 보았다
그랬더니 신기하게 규칙이 보였다.
i반복
j반복
ij=i0*0j+i1*1j
-----------------------------------------------------------------------------------------------------------------
Z[i][j] = X[i][0] * Y[0][j] + X[i][1] * Y[1][j]; 부분을조금 변형시켜 보았다
1
2
3
4
5
|
int Z={0};
for (int i = 0; i < 4; i++)
for (int j = 0; j < 3; j++)
for (int k = 0; k < 2; k++)
Z[i][j] = Z[i][j]+X[i][k] * Y[k][j];
|
cs |