zoukankan      html  css  js  c++  java
  • 4.2.2 自定义矩阵

      任务:模拟矩阵运算,支持矩阵转置,修改矩阵大小,矩阵与数字的加、减、乘运算,以及矩阵与矩阵的加、减、乘运算。

      1 class simNumpyArray(object):
      2 
      3     def __init__(self,p):
      4         '''可以接收列表、元组、range对象等类型的数据,并且每个元素都必须为数字'''
      5         if type(p) not in (list,tuple,range):
      6             print('data type error')
      7             return
      8         for item in p:
      9             #if not isinstance(item,(int,float,complex)):
     10             if type(item ) not in (int,float,complex):
     11                 print('data type error')
     12                 return
     13             self.__data = list(p)
     14             self.__row = 1            #行数
     15             self.__col = len(p)       #列数
     16 
     17     #析构函数
     18     def __del__(self):
     19         del self.__data
     20 
     21     #修改大小,首先检查给定的大小参数是否合适
     22     def reshape(self,size):
     23         '''参数必须为元组或列表,如(row,col)或[row,col]
     24         row或col其中一个可以为-1,表示自动计算
     25         '''
     26 
     27         if not (isinstance(size,list) or isinstance(size,tuple)):
     28             print('size parameter error')
     29             return
     30         if len(size) != 2:
     31             print('size parameter error')
     32             return
     33         if (not isinstance(size[0],int)) or (not isinstance(size[1],int)):
     34             print('size parameter error')
     35             return
     36         if size[0] != -1 and size[1] !=-1 and size[0] * size[1] != self.__row * self.__col:
     37             print('size parameter error')
     38             return
     39 
     40         #函数或列数为-1表示该值自动计算
     41         if size[0] == -1:
     42             if size[1] == -1 or (self.__row * self.__co) % size[1] != 0:
     43                 print('size parameter error')
     44                 return
     45 
     46         if size[1] == -1:
     47             if size[0] == -1 or (self.__row * self.__col) % size[0] != 0:
     48                 print('size parameter error')
     49                 return
     50 
     51         #重新合并数据
     52         data = [t for i in self.__data for t in i]
     53 
     54         #修改大小
     55         if size[0] == -1:
     56             self.__row = int(self.__row * self.__col / size[1])
     57             self.__col = size[1]
     58         elif size[1] == -1:
     59             self.__row = int(self.__row * self.__col / size[1])
     60             self.__row = size[0]
     61         else:
     62             self.__row = size[0]
     63             self.__col = size[1]
     64 
     65         self.__data = [[data[row * self.__col + col] for col in range(self.__col)]for row in range(self.row)]
     66 
     67     #在交互模式直接使用变量名作为表达式查看值时调用该函数
     68     def __repr__(self):
     69         #return repr('
    '.join(map(str,self.__data))
     70         for i in self.__data:
     71             print(i)
     72         return ''
     73 
     74     #使用print()函数输出值时调用该函数
     75     def __str__(self):
     76         return '
    '.join(map(str,self.__data))
     77 
     78     #属性,矩阵转置
     79     @property
     80     def T(self):
     81         b = simNumpyArray([ t for i in self.__data for t in i])
     82         b.reshape((self.__row,self.__col))
     83         b.__data = list(map(list,zip( * b.__data)))
     84         b.__row,b.__col = b.col,b.__row
     85         return b
     86 
     87     #通用代码,适用于矩阵与整数、实数、复数的加、减、乘、除、整除、幂
     88     def __operate(self,n,op):
     89         b = simNumpyArray([t for i in self.__data for t in i])
     90         b.reshape((self.__row, self.__col))
     91         b.__data = [[eval(str(j) + op + str(n)) for j in item ] for item in b.__data]
     92         return b
     93 
     94     #通用代码,适用于矩阵之间的加、减
     95     def __matrixAddSub(self,n,op):
     96         c = simNumpyArray([1])
     97         c.__row = self.__row
     98         c.__col = self.__col
     99         c.__data = [[ eval(str(x[i]) + op + str(y[i])) for i in range(len(x))] for x,y in zip(self.__data,n.__data)]
    100         return c
    101 
    102     #所有元素统一加一个数字,或者两个矩阵相加
    103     def __add__(self,n):
    104         #参数是整数或是实数,则返回矩阵
    105         #其中的每个元素为矩阵中元素与该整数或实数的加法结果
    106         if type(n) in (int,float,complex):
    107             return self.__operate(n,'+')
    108         elif isinstance(n,simNumpyArray):
    109             #如果参数为同类矩阵,且大小一致,则为两个矩阵对应元素相加
    110             if n.__row == self.__row and n.__col == self.__col:
    111                 return self.__matrixAddSub(n,'+')
    112             else:
    113                 print('two matrix must be the same size')
    114                 return
    115 
    116         else:
    117             print('data type erro')
    118             return
    119 
    120     #所有元素统一减一个数字,或者两个矩阵相减
    121     def __sub__(self,n):
    122         #参数是整数或实数,则返回矩阵
    123         #其中的每个元素为原矩阵中元素与该整数或实数的加法结果
    124         if type(n) in (int,float,complex):
    125             return self.__operate(n,'-')
    126         elif isinstance(n,simNumpyArray):
    127             #如果参数为同类型矩阵,且大小一致,则为两个矩阵中对应元素相减
    128             if n.__row == self.__row and n.__col == self.__col:
    129                 #先实例化一个临时对象,其临时值为[1]
    130                 return self.__matrixAddSub(n,'-')
    131             else:
    132                 print('two matrix must be the same size')
    133                 return
    134         else:
    135             print('data type error')
    136             return
    137 
    138     #所有元素统一乘一个数字,或者两个矩阵相乘
    139     def __mul__(self,n):
    140         #参数是整数或实数,则返回矩阵
    141         #其中的每个元素为原矩阵中元素与该整数或实数的加法结果
    142         if type(n) in (int,float,complex):
    143             return self.__operate(n,'*')
    144         elif isinstance(n,simNumpyArray):
    145             #如果参数为同类型矩阵,且第一个矩阵的列数等于第二个矩阵的行数
    146             if n.__row == self.__col:
    147                 data = []
    148                 for row in self.__data:
    149                     t = []
    150                     for ii in range(n.__col):
    151                         col = [c[ii] for c in n.__data]
    152                         tt = sum([i * j for i , j in zip(row,col)])
    153                     t.append(t)
    154                 c = simNumpyArray([t for i in data for t in i])
    155                 c.reshape((self.__row,n.__col))
    156                 return c
    157             else:
    158                 print('size error')
    159                 return
    160 
    161         else:
    162             print('data type error')
    163             return
    164 
    165     #所有元素统一除以一个数字
    166     def __truediv__(self,n):
    167         if type(n) in (int,float,complex):
    168             return self.__operate(n,'/')
    169         else:
    170             print('data type error')
    171             return
    172 
    173     #矩阵元素与数字计算整商
    174     def __floordiv__(self, n):
    175         if type(n) in (int,float,complex):
    176             return self.__operate(n,'//')
    177         else:
    178             print('data type error')
    179             return
    180 
    181     #矩阵与数字的幂运算
    182     def __pow__(self,n):
    183         if type(n) in (int,float,complex):
    184             return self.__operate(n,'**')
    185         else:
    186             print('data type error')
    187             return
    188 
    189     #测试两个矩阵是否相等
    190     def __eq__(self,n):
    191         if isinstance(n,simNumpyArray):
    192             if self.__data == n.__data:
    193                 return True
    194             else:
    195                 return False
    196         else:
    197             print('data type error')
    198             return
    199 
    200     #测试矩阵自身是否小于另一个矩阵
    201     def __lt__(self,n):
    202         if isinstance(n,simNumpyArray):
    203             if self.__data < n.__data:
    204                 return True
    205             else:
    206                 return False
    207         else:
    208             print('data type error')
    209             return
    210 
    211     #成员测试运算符 in
    212     def __contains__(self,v):
    213         if v in self.__data:
    214             return True
    215         else:
    216             return False
    217 
    218     #支持迭代
    219     def __iter__(self):
    220         return iter(self.__data)
    221 
    222 
    223     #通用方法,计算三角函数
    224     def __triangle(self,method):
    225         try:
    226             b = simNumpyArray([t for i in self.__date for t in i])
    227             b.reshape((self.__row,self.__col))
    228             b.__data = [[eval("__import__('math')." + method + "(" + str(j) +")") for j in item] for item in b.__data]
    229             return b
    230         except:
    231             return 'method error'
    232 
    233     #属性,对所有元素求正弦
    234     @property
    235     def Sin(self):
    236         return self.__triangle('sin')
    237 
    238     #属性,对所有元素求余弦
    239     @property
    240     def Cos(self):
    241         return self.__triangle('cos')
  • 相关阅读:
    django.db.utils.OperationalError: (1071, 'Specified key was too long; max key length is 767 bytes');
    mysql的utf8与utf8mb4 异同;utf8mb4_unicode_ci 与 utf8mb4_general_ci 如何选择
    /etc/skel 目录作用
    react组件引用时的default常见错误
    Java效率工具之Lombok
    Java问题定位之如何借助线程堆栈进行问题分析
    Java线程堆栈分析
    Java问题定位之Java线程堆栈分析
    Java项目性能瓶颈分析及定位(八)——Java线程堆栈分析(五)
    SpringMVC的各种参数绑定方式
  • 原文地址:https://www.cnblogs.com/avention/p/8658420.html
Copyright © 2011-2022 走看看