자료구조

[C로 쓴 자료구조] 희소행렬의 곱

안도일 2022. 9. 28. 16:12

희소 행렬을 < col, row , value > 3원소 쌍을 사용하는 1차원 배열로 구성하였을 때 두 희소 행렬의 곱을 구해보자.

 

두 희소행렬 a와 b를 < col, row , value > 3원소 쌍을 사용하는 1차원 배열로 구성

 

 

 

행렬 곱셈의 원리상 a행렬의 한 행과 b행렬의 한열을 곱하는데 희소 행렬 표시에서 같은 row(열)로 계산하면 편하므로 b행렬을 전치하여 col을 row로 변경 후 계산한다.

 

 

 

계산을 시작해보자

 

먼저 a행렬의 row가 0일 때, b행렬의 row가 0일 때 부터 시작하자

col = 0 -> a[0][0]: 15  *  b[0][0]: 1 = 15

col = 3 -> a[0][3]: 22 * b 존재하지 않음 

col = 5 -> a[0][5]: -15 * b 존재하지 않음

 

a행렬의 row가 0일 때, b행렬의 row가 1 일 때

col = 0 -> 

col = 3 -> a[0][3] : 22 * b[1][3] :1 = 22

col = 5 -> a[0][5] : -15 * b 존재하지 않음

 

a행렬의 row가 1일 때, b행렬의 row가 0일 때

col = 1 -> a[1][1] : 11 * b 존재하지 않음

col = 2 -> a[1][2] : 3 * b[0][2] : 3 = 9

 

a행렬의 row가 1일 때, b행렬의 row가 1일 때

col = 1 -> a[1][1] : 11 * b[1][1] : 1 = 11

col = 2 -> a[1][2] : 3 * b 존재하지 않음   

 

이처럼 계산하면

 

          row  col  value

d[0]       6    2     7

d[1]       0    0    15 

d[2]       0    1    22

d[3]       1    0      9

d[4]       1    1     11

d[5]       2    1     -6

d[6]       4    0     91

d[7]       5    0     84

 

결과 값이다.

 

 

 

여기서 아래와 같이 b[0][1]의 값이 1로 변경되었을 때,  a행렬의 row가 1일 때를  다시 계산해 보자.

 

 

a행렬의 row가 1일 때, b행렬의 row가 0일 때

col = 1 -> a[1][1] : 11 * b[0][1] : 1 = 11

col = 2 -> a[1][2] : 3 * b[0][2] : 3 = 9

d[1][0] : 11 + 9 = 20

 

a행렬의 row가 1일 때, b행렬의 row가 1일 때

col = 1 -> a[1][1] : 11 * b[1][1] : 1 = 11

col = 2 -> a[1][2] : 3 * b 존재하지 않음