[문제]
행렬의 곱셈은, 곱하려는 두 행렬의 어떤 행과 열을 기준으로, 좌측의 행렬은 해당되는 행, 우측의 행렬은 해당되는 열을 순서대로 곱한 값을 더한 값이 들어갑니다. 행렬을 곱하기 위해선 좌측 행렬의 열의 개수와 우측 행렬의 행의 개수가 같아야 합니다. 곱할 수 있는 두 행렬 A,B가 주어질 때, 행렬을 곱한 값을 출력하는 productMatrix 함수를 완성해 보세요.
[풀이]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | def productMatrix(mat1, mat2): matR = [ len(mat2[0])*[0] for i in range (len(mat1)) ] for i in range (len(matR) ): for j in range ( len(matR[i]) ): for k in range ( len(mat1[i] ) ): matR[i][j] += mat1[i][k]*mat2[k][j] return matR # 아래는 테스트로 출력해 보기 위한 코드입니다. a = [ [ 1, 2 ], [ 2, 3 ]]; b = [[ 3, 4], [5, 6]]; print("결과 : {}".format(productMatrix(a,b))); | cs |
파이썬을 이용한 추가적인 행렬의 연산
- Practice1 : 행렬 출력
1 2 3 | def print_matrix(mat): for i in range (len(mat)): print mat[i] | cs |
- input값은 리스트로 받는다. 그리고 리스트 크기 만큼 출력을 한다.
- Practice2 : 행렬의 스칼라곱
1 2 3 4 5 | def scalar_product(mat, mulNum): for i in range (len(mat)): for j in range(len(mat[i])): mat[i][j] = mulNum * mat[i][j] return mat | cs |
- 행을 위한 for문(2번째 줄), 열을 위한 for문(3번째 줄)을 이용하여 2중 반복문을 만들고, 각각의 요소에 입력받은 mulNum을 받았다.
- Practice3 : 행렬의 곱
1 2 3 4 5 6 7 8 9 10 | def matrix_multiplication(mat1, mat2): matR = [ len(mat2[0])*[0] for i in range (len(mat1)) ] for i in range (len(matR) ): for j in range ( len(matR[i]) ): for k in range ( len(mat1[i] ) ): matR[i][j] += mat1[i][k]*mat2[k][j] return matR | cs |
- 행렬 곱은 제일 까다롭다. 첫 번째 행렬 mat1이 mxn의 size이고, 두 번째 행렬 mat2가 n*l 사이즈 라고 가정을 하면, 두 행렬의 곱 결과 사이즈는 m*l이다.
- Practice1~3 파이썬을 이용한 행렬의 연산 테스트 코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | mat1 = [[1,3,5], [2,4,8]] mat2 = [[3,2], [1, 4], [5,0]] print "[Practice 1]" print_matrix(mat1) print_matrix(mat2) print "[Practice2]" print scalar_product(mat1, 10) print_matrix(scalar_product(mat2, 5)) mat1 = [[1,3,5], [2,4,8]] mat2 = [[3,2], [1, 4], [5,0]] print "[Practice3]" print_matrix(matrix_multiplication(mat1, mat2)) print_matrix(matrix_multiplication(mat2, mat1)) | cs |
참고하면 좋은 사이트 : http://rednooby.tistory.com/81
'Computer Science > Problem Solving' 카테고리의 다른 글
[tryhelloworld] 같은 수는 싫어 by파이썬 (0) | 2017.08.14 |
---|---|
[tryhelloword]level1 제일 작은 수 제거하기 by 파이썬 (0) | 2017.08.14 |
[tryhelloworld]level1 행렬의 덧셈 by 파이썬 (0) | 2017.07.31 |
[tryhelloworld]level1 핸드폰 번호 가리기 by파이썬 (0) | 2017.07.31 |
[tryhelloworld]x만큼 간격이 있는 n개의 숫자 (0) | 2017.07.30 |