Решил я попрактиковаться в ООП.
class Matrix(object):
def __init__(self,x,y,content):
''' x - height,
y - width,
content - two-dimensional array
Example: matrix = Matrix(3,2,
[ [1,2],
[3,4],
[5,6] ])'''
if len(content) == x:self.height = x
else:raise ValueError("Different height")
for i in range(self.height):
if len(content[i]) != y:raise ValueError("Different width")
self.width = y
self.content = content
def __repr__(self):
out = ''
for i in range(self.height):
out += ' '.join(map(str,self.content[i]))
out += '\n'
return out
def mul_on_num(self, number):
''' return Matrix object'''
ctx =[[number * self.content[i][j] for j in range(self.width)] for i in range(self.height)]
return Matrix(self.height,self.width,ctx)
def __add__(self, matrix):
if matrix.width != self.width or matrix.height != self.height:
raise ValueError("Different sizes of the matrix")
ctx =[[matrix.content[i][j] + self.content[i][j] for j in range(self.width)] for i in range(self.height)]
return Matrix(self.height,self.width,ctx)
def __mul__(self,matrix):
if self.width == matrix.height:
n = self.width;mode = 0
elif matrix.width == self.height:
n = matrix.width;mode = 1
else:
raise ValueError("Different size")
if mode:
c = [[0 for i in range(self.width)] for j in range(matrix.height)]
for i in range(matrix.height):
for j in range(self.width):
for k in range(n):
c[i][j] += matrix.content[i][k]*self.content[k][j]
return Matrix(matrix.height, self.width, c)
else:
c = [ [0 for i in range(matrix.width)] for j in range(self.height)]
for i in range(self.height):
for j in range(matrix.width):
for k in range(n):
c[i][j] += self.content[i][k] * matrix.content[k][j]
return Matrix(self.height,matrix.width, c)
Возможно, что-то делаю не так, но почему при вызове такого скрипта:
from main import Matrix
m = Matrix(2,2,[ [2,2],[2,2] ])
s = Matrix(2,2,[ [2,2],[2,2] ])
print('\n'*10)
k = s*m
print(k)
Получается так вывод:
8 8
8 8
.
.
Вместо точки \n
В самом конце появляются два \n
Я еще пытался использовать __str__, но при вызове m = Matrix(2,2,[ [2,2],[2,2] ]) у меня печаталсь матрица
2 2
2 2
.
.
Можно ли тут что-то улучшить (в плане архитектуры, красоты кода)?