본문 바로가기

파이썬 프로그래밍/파이썬 심화

[Python] 파이썬예제. 행렬곱셈(2byte) 풀이

본 게시글은 2byte의 행렬곱셈만 가능한 코드입니다.



행렬 A: [1, 2]

          [3, 4]


행렬B:  [5 ,6]

    [7, 8]


2byte인 두 행렬의 곱셈을 하는 코드를 구하시오



행렬의 곱셈 이해하기

먼저 행렬을 기본적으로 표현하면 이렇게 됩니다.



행렬의 곱셈은 A와 B는 처럼 묶여서 움직입니다.



들어가기전 주소값은 이렇게 표현할 수 있습니다.






이제 행렬의 곱셈을 섹션으로 나눠서 살펴보겠습니다.

우리는 알고리즘을 생각해야 하니 주소값에 맞춰서 생각해보겠습니다.

총 4섹션으로 이루어져 있습니다.

섹션1에서 상단박스와 하단박스를 더하는 식으로 구성되며, 곱할 수의 주소값을 주황색으로 표시해 보았습니다.



섹션 2입니다.



섹션3 입니다.



섹션4 입니다.

여기까지 섹션마다 어떻게 행렬의 곱셈이 되는지 감이 오실겁니다.

이제 이 행렬곱셈의 주소값의 공통점을 찾아 알고리즘을 생각해 보겠습니다.




먼저 섹션마다 주소값을 정리해봤습니다. 우리는 여기서 반복적인 공통점을 찾아야 합니다.

그렇게 i,j라는 변수를 찾아서 해보려고 하는데 어떻게 해도 i,j만으로는 공통적인 부분을 찾기 힘들다는 것을 알 수 있습니다.

이럴땐 증가값 변수를 하나더 추가해 보도록 합니다.





반복문을 3개 사용하여 1씩 증가시켰을때 아래 사진의 우측 표를 보시는것처럼 증가값이 변하는 것을 알 수 있습니다

우리는 이 표를 참고하여 사용해보겠습니다.

아무리 봐도 감이 안오시는분은 아래를 보시면 됩니다.



1개의 섹션당 2개의 No(반복문)이 실행되는 것을 확인할 수 있습니다.

박스 색깔별로 보시면 감이 좀 오시나요?

검정박스: 주소값이 모두 0이므로 No도 0입니다.

빨간박스: 2개의 주소가 1이 올라와 있네요. 이것은 가장 말단 j의 값이 올라갔다고 볼 수 있겠죠.



그렇다면 지금 no.2에 맞춰서 j를 표시해봅시다.



No3과 섹션2의 첫번째를 보시면 갑자기 i가 1 증가한것을 보실수 있죠?



같은방법으로 표시해봅니다.



이렇게 올라가다보면 k값도 유추할 수 있습니다.



결국 모두 찾아냈습니다.

행렬 A는 A[k][j]의 주소값을

행렬 B는 B[j][i]의 주소값을 가지고 있는것을 확인하실 수 있습니다.



코드

학습목적 코드)

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
def productMatrix(A, B):
    gop = 0
    result = 0
    an = []
    for k in range(2):
        answer = [] #행렬을 2개씩 나누기 위해 초기화기준을 잡았습니다.
 
        for i in range(0,2):
            result = 0 #곱한 수를 더하면 바로 초기화합니다(안그럼 더한수가 계속 누적됩니다)
            for j in range(0,2):
                gop = (A[k][j] * B[j][i]) #위에서 보았던 행렬곱셈의 핵심 공식
                print('k   j   i')
                print('{}   {}   {}'.format(k,j,i))
                print('{}   {}   {}'.format(A[k][j],B[j][i],gop))
                print('===================================')
                result = result+gop          #행렬을 곱하자마자 값을 더합니다.
                print('result: {}'.format(result))
            answer.append(result) #곱한수 2개를 더하면 바로 추가해줍니다.
        an.append(answer) #값이 6번째줄에서 초기화 되기 때문에 따로 저장합니다.
 
    return an
 
# 아래는 테스트로 출력해 보기 위한 코드입니다.
= [ [ 12 ], [ 34 ]];
= [[ 56], [78]];
print("결과 : {}".format(productMatrix(a,b)));
cs



result는 A와 B를 곱할때 마다 출력하게 했습니다.

각각 값이 들어오는것을 확인하면서 코딩한다면 각각 어디에 값이 들어오는지 쉽게 이해할 수 있습니다.



일반코드 답

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def productMatrix(A, B):
    gop = 0
    result = 0
    an=[]
    for k in range(2):
        answer=[]
        for i in range(0,2):
            result = 0
            for j in range(0,2):
                gop = (A[k][j]*B[j][i])
                result = result + gop
            answer.append(result)
        an.append(answer)
    return an
 
# 아래는 테스트로 출력해 보기 위한 코드입니다.
= [ [ 12 ], [ 34 ]];
= [[ 56], [78]];
print("결과 : {}".format(productMatrix(a,b)));
cs


실행