Решение задачи Добавить, умножить с Яндекс Контест

Без пояснения   Просмотров: 2312


Добавьте в предыдущий класс следующие методы:

__add__ принимающий вторую матрицу того же размера и возвращающий сумму матриц
__mul__ принимающий число типа int или float и возвращающий матрицу, умноженную на скаляр
__rmul__ делающий то же самое, что и __mul__. Этот метод будет вызван в том случае, аргумент находится справа. Можно написать __rmul__ = __mul__
Например:

В этом случае вызовется __mul__: Matrix([[0, 1], [1, 0]) * 10

В этом случае вызовется __rmul__ (так как у int не определен __mul__ для матрицы справа): 10 * Matrix([[0, 1], [1, 0])

Разумеется, данные методы не должны менять содержимое матрицы.

Код

from sys import stdin
from copy import deepcopy


class MatrixError(BaseException):
    def __init__(self, first, second):
        self.matrix1 = first
        self.matrix2 = second


class Matrix(object):
    def __init__(self, matrix):
        self.matrix = deepcopy(matrix)

    def __str__(self):
        return '\n'.join('\t'.join(map(str, row)) for row in self.matrix)

    def __add__(self, other):
        bl = len(self.matrix) == len(other.matrix)
        if bl and len(self.matrix[0]) == len(other.matrix[0]):
            l = []
            for i in range(len(self.matrix)):
                t = []
                if len(self.matrix[i]) != len(other.matrix[i]):
                    raise MatrixError(self, other)
                for j in range(len(self.matrix[0])):
                    t.append(self.matrix[i][j] + other.matrix[i][j])
                l.append(t)
            return '\n'.join('\t'.join(map(str, row)) for row in l)
        else:
            raise MatrixError(self, other)

    def __mul__(self, a):
        if isinstance(a, int) or isinstance(a, float):
            res = deepcopy(self)
            for i in range(self.size()[0]):
                for j in range(self.size()[1]):
                    res.matrix[i][j] *= a
        else:
            if self.size()[1] == a.size()[0]:
                res = []
                for j in range(self.size()[0]):
                    res.append([0 for i in range(a.size()[1])])
                res = Matrix(res)
                for i in range(len(self.matrix)):
                    for j in range(len(a.matrix[0])):
                        for k in range(len(a.matrix)):
                            t = self.matrix[i][k] * a.matrix[k][j]
                            res.matrix[i][j] += t
            else:
                raise MatrixError(self, a)
        return res

    def __rmul__(self, num):
        return self.__mul__(num)

    def size(self):
        return (len(self.matrix), len(self.matrix[0]))

    def transpose(self):
        transMatrix = list(zip(*self.matrix))
        self.matrix = transMatrix
        return Matrix(transMatrix)

    def transposed(self):
        transMatrix = list(zip(*self.matrix))
        return Matrix(transMatrix)
exec(stdin.read())

         

Администратор Photo Автор: Администратор



Комментарии

Чтобы написать комментарии вам нужно войти в систему или зарегистрироваться



Заявка на расчет