from math import *
class Matrix:
def __init__(self,mat):
self.mat=None
self.array=None
self.value=None
if isinstance(mat, list) and all(isinstance(row, list) for row in mat):
self.mat = mat
self.drow = len(mat)
self.dcol = len(mat[0])
elif isinstance(mat, list):
self.array = mat
self.len = len(mat)
elif isinstance(mat,(int, float)):
self.value=mat
else:
raise ValueError("Invalid matrix or value")
def __add__(self, other):
if self.mat and other.mat and self.drow == other.drow and self.dcol == other.dcol:
return list(map(lambda x, y: [i + j for i, j in zip(x, y)], self.mat, other.mat))
elif self.array and other.array and self.len==other.len:
return [i+j for i,j in zip(self.array,other.array)]
else:
return None
def __sub__(self, other):
if self.mat and other.mat and self.drow == other.drow and self.dcol == other.dcol:
return list(map(lambda x, y: [i - j for i, j in zip(x, y)], self.mat, other))
elif self.array and other.array and self.len==other.len:
return [i+j for i,j in zip(self.array,other.array)]
else:
return None
def __mul__(self, other):
if self.mat and other.mat:
if self.dcol == other.drow:
res = []
mat_ = [self.mat[floor(i / other.drow) % self.drow] for i in range(len(self.mat * other.drow))]
other_ = [[other.mat[i][j] for i in range(other.drow)] for j in range(other.dcol)] * self.drow
res_ = list(map(lambda x, y: sum([i * j for i, j in zip(x, y)]), mat_, other_))
for i in range(self.drow):
temp = []
for j in range(other.dcol):
temp.append(res_.pop(0))
res.append(temp)
return res
elif self.mat and other.array:
other.mat = [].append(other.array)
self.__mul__(other.mat)
elif self.array and other.mat:
self.mat=[].append(self.array)
self.__mul__(other.mat)
elif self.value and (other.array or other.mat):
if other.array:
return [self.value*i for i in other.array]
if other.mat:
return [[self.value*i for i in j] for j in other.mat]
elif (self.array or self.mat) and other.value:
if self.array:
return [round(other.value*i,3) for i in self.array]
if self.mat:
return [[round(other.value * i,3) for i in j] for j in self.mat]
def __truediv__(self, other):
if (self.mat or self.array)and other.value:
return self.__mul__(self.__class__(1/other.value))
a=Matrix([[1,2,3,4,5],
[2,2,3,4,5]])
b=Matrix([[3,2,1,5,4],
[4,2,1,5,4],
[1,2,3,4,5],
[1,2,3,4,5],
[1,2,3,4,5]
])
c=Matrix([1,2,3,4,5])
d=Matrix(3)
运行结果:
a*b
[[23, 30, 39, 63, 72], [26, 32, 40, 68, 76]]
c*d
[3, 6, 9, 12, 15]
b*d
[[9, 6, 3, 15, 12], [12, 6, 3, 15, 12], [3, 6, 9, 12, 15], [3, 6, 9, 12, 15], [3, 6, 9, 12, 15]]
c/d
[0.333, 0.667, 1.0, 1.333, 1.667]