from copy import deepcopy class MatrixError(BaseException): def __init__(self, m1, m2): self.matrix1 = m1 self.matrix2 = m2 class Matrix: def __init__(self, x): self.x = deepcopy(x) def __str__(self): res = '' for i in range(len(self.x)): for j in range(len(self.x[i])): res += str(self.x[i][j]) if j != len(self.x[i]) - 1: res += '\t' if i != len(self.x) - 1: res += '\n' return res #size of the matrix def size(self): return len(self.x), len(self.x[0]) #Addition def __add__(self, m2): if self.size() != m2.size(): raise MatrixError(self, m2) else: res = Matrix(self.x).x for i in range(len(m2.x)): for j in range(len(m2.x[0])): res[i][j] += m2.x[i][j] return Matrix(res) #Multiplication def __mul__(self, a): if type(a) is not int and type(a) is not float: if self.size()[1] != a.size()[0]: raise MatrixError(self, a) else: res = [] i = 0 while i < self.size()[0]: tmp = [] for j in range(a.size()[1]): cur = 0 for k in range(a.size()[0]): cur += self.x[i][k] * a.x[k][j] tmp.append(cur) i += 1 res.append(tmp) return Matrix(res) else: res = Matrix(self.x).x for i in range(len(res)): for j in range(len(res[i])): res[i][j] *= a return Matrix(res) __rmul__ = __mul__ #Transposition def transpose(self): res = [] for j in range(self.size()[1]): tmp = [] for i in range(self.size()[0]): tmp.append(self.x[i][j]) res.append(tmp) self.x = res return Matrix(res) @staticmethod def transposed(m): res = [] for j in range(m.size()[1]): tmp = [] for i in range(m.size()[0]): tmp.append(m.x[i][j]) res.append(tmp) return Matrix(res) #Example m = Matrix([[1, 0, 0],[0, 1, 0],[0, 0, 1]]) m1 = Matrix([[3, 2], [-10, 0], [14, 5]]) m2 = Matrix([[5, 2, 10], [-0.5, -0.25, 18], [-22, -2.5, -0.125]]) m3 = Matrix.transposed(m) print(5 * m2) print(m2 * (120 * m * m1)) print(m3)