스쿼드

[스쿼드] Matrix 만들기

kinggoddino 2024. 8. 5.

0. 문제

m1 = Matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
m2 = Matrix([[9, 8, 7], [6, 5, 4], [3, 2, 1]])

m1 + m2
m1 - m2
m1 * m2
m1 / m2

matrix 로 출력하기

 

1. Matrix 클래스 만들고 초기화 메서드 선언

class Matrix:
    def __init__(self, data = 0): 
        self.data = data

클래스를 인스턴스화 시키는 초기화(생성자) 메서드 먼저 만들기.

딕셔너리를 인자로 받을 때는 변수에 self.name, self.age 이런식으로 key를 적으면 됐었는데 얘는 행렬이라서 아무 변수로나 이름 적어서 받아와준다.

내맘이라서 data 자리에 dino 라고 써도 문제없음.

data = 0 으로 디폴트값을 설정해주면 빈 행렬도 매트릭스 객체로 생성할 수 있다.

 

 

2. 사칙연산 메서드 만들기

    def __add__(self, other):
        re_matrix = []
        for row1, row2 in zip(self.data, other.data):
            re_row = []
            for i, j in zip(row1, row2):
                re_row.append(i + j)
            re_matrix.append(re_row)
        return Matrix(re_matrix)

zip으로 두 행렬 매칭해서 튜플로 묶어준다

두 행렬에서 행들이 묶여있을테니 변수 이름을 row1,2 로 지었음

다시 zip으로 요소 매칭해서 묶어준다

그리고 덧셈연산해서 행 리스트에 새로 더해주고

그 리스트를 새로운 행으로 잡고 matrix 리스트에 더해서 행렬식 만들어주기

 

    def __truediv__(self, other):   # 나눗셈
        re_matrix = []
        for row1, row2 in zip(self.data, other.data):
            re_row = []
            for i, j in zip(row1, row2):
                re_row.append(round(i / j, 1))   # round()
            re_matrix.append(re_row)
        return Matrix(re_matrix)

나머지 뺄셈 곱셈도 해준다.

근데 나눗셈은 소숫점이 너무 길면 보기 귀찬으니까

round 함수로 소수점 첫째자리까지만 나오게 설정해줌

 

 

3. 행렬처럼 보이게 만들기

    def __repr__(self):
        readable = []
        for row in self.data:
            readable_row = ' '.join(f'{num:<3}' for num in row)
            readable.append(readable_row)
        matrix_readable = '\n'.join(readable)            
        return matrix_readable

__str__ 

__repr__ 선언

리스트 안의 리스트 형태로 만들어진 matrix를

문자열로 join 시켜주기

num:<3은 글자 여백 맞춰서 정렬할려고 넣은거

    def __repr__(self):
        matrix_readable = ""
        for row in self.data:
            matrix_readable += '\n'.join(map(str, row))
        return matrix_readable.strip()

다른방법

 

 

 

4. 완성코드

class Matrix:
    def __init__(self, data = 0): 
        self.data = data          
        
    def __add__(self, other):
        re_matrix = []
        for row1, row2 in zip(self.data, other.data):
            re_row = []
            for i, j in zip(row1, row2):
                re_row.append(i + j)
            re_matrix.append(re_row)
        return Matrix(re_matrix)

    def __sub__(self, other):
        re_matrix = []
        for row1, row2 in zip(self.data, other.data):
            re_row = []
            for i, j in zip(row1, row2):
                re_row.append(i - j)
            re_matrix.append(re_row)
        return Matrix(re_matrix)
            
    def __mul__(self, other):
        re_matrix = []
        for row1, row2 in zip(self.data, other.data):
            re_row = []
            for i, j in zip(row1, row2):
                re_row.append(i * j)
            re_matrix.append(re_row)
        return Matrix(re_matrix)

    def __truediv__(self, other):
        re_matrix = []
        for row1, row2 in zip(self.data, other.data):
            re_row = []
            for i, j in zip(row1, row2):
                re_row.append(round(i / j, 1))
            re_matrix.append(re_row)
        return Matrix(re_matrix)
            
    def __repr__(self):
        readable = []
        for row in self.data:
            readable_row = ' '.join(f'{num:<3}' for num in row)
            readable.append(readable_row)
        matrix_readable = '\n'.join(readable)            
        return matrix_readable
    
m1 = Matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
m2 = Matrix([[9, 8, 7], [6, 5, 4], [3, 2, 1]])
            
print(f'm1 + m2:\n{m1 + m2}\n')
print(f'm1 - m2:\n{m1 - m2}\n')
print(f'm1 * m2:\n{m1 * m2}\n')
print(f'm1 / m2:\n{m1 / m2}\n')

 

 

 

 

 


 

'스쿼드' 카테고리의 다른 글

포맷  (0) 2024.09.10
[스쿼드] 캡슐화  (0) 2024.08.06
[스쿼드] 계산기 만들기  (0) 2024.08.02
[Python] 파이썬 문법 기본문제  (0) 2024.07.31
[Python] 파이썬 문법 기본문제  (0) 2024.07.30