python 矩阵的基本运算(加、减、乘、除)

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]

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TimeWrangler

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值