Guest User

Untitled

a guest
Feb 15th, 2023
21
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.89 KB | None | 0 0
  1. class Matrix:
  2. def __init__(self, name, m, n, values):
  3. self.name = name
  4. self.m = m
  5. self.n = n
  6. self.values = values
  7.  
  8. def __str__(self):
  9. rows = [self.values[i:i+self.n] for i in range(0, len(self.values), self.n)]
  10. return f'{self.name} = \n' + '\n'.join([' '.join(map(str, row)) for row in rows])
  11.  
  12. def __repr__(self):
  13. return f'Matrix({self.name}, {self.m}, {self.n}, {self.values})'
  14.  
  15.  
  16. class MatrixMultiplier:
  17. def __init__(self, matrices=None):
  18. self.matrices = [] if matrices is None else matrices
  19.  
  20. def create_matrix(self, name):
  21. m = int(input(f'Introduceți numărul de rânduri pentru matricea {name}: '))
  22. n = int(input(f'Introduceți numărul de coloane pentru matricea {name}: '))
  23. values = []
  24. for i in range(m):
  25. for j in range(n):
  26. value = int(input(f'Introduceți valoarea pentru poziție ({i}, {j}) în matricea {name}: '))
  27. values.append(value)
  28. matrix = Matrix(name, m, n, values)
  29. self.matrices.append(matrix)
  30.  
  31. def add_matrices(self, name1, name2):
  32.  
  33. matrix1 = next(matrix for matrix in self.matrices if matrix.name == name1)
  34. matrix2 = next(matrix for matrix in self.matrices if matrix.name == name2)
  35. if matrix1.m != matrix2.m or matrix1.n != matrix2.n:
  36. raise ValueError('Cele două matrice trebuie să aibă aceleași dimensiuni')
  37. result = [matrix1.values[i] + matrix2.values[i] for i in range(len(matrix1.values))]
  38. return Matrix(f'{name1}+{name2}', matrix1.m, matrix1.n, result)
  39.  
  40. def multiply_matrices(self, name1, name2):
  41.  
  42. matrix1 = next(matrix for matrix in self.matrices if matrix.name == name1)
  43. matrix2 = next(matrix for matrix in self.matrices if matrix.name == name2)
  44. if matrix1.n != matrix2.m:
  45. raise ValueError('Numărul de coloane din prima matrice trebuie să se potrivească cu numărul de rânduri din a doua matrice')
  46. result = []
  47. for i in range(matrix1.m):
  48. for j in range(matrix2.n):
  49. val = 0
  50. for k in range(matrix1.n):
  51. val += matrix1.values[i * matrix1.n + k] * matrix2.values[k * matrix2.n + j]
  52. result.append(val)
  53. return Matrix(f'{name1}{name2}', matrix1.m, matrix2.n, result)
  54.  
  55. def scalar_multiply(self, name, scalar):
  56.  
  57. matrix = next(matrix for matrix in self.matrices if matrix.name == name)
  58. result = [scalar * val for val in matrix.values]
  59. matrix.values = result
  60. matrix.name = f'{scalar}{name}'
  61. return Matrix(f'{scalar}{name}', matrix.m, matrix.n, result)
  62.  
  63. def flip_matrix(self, name):
  64.  
  65. matrix = next(matrix for matrix in self.matrices if matrix.name == name)
  66. result = []
  67. for j in range(matrix.n):
  68. for i in range(matrix.m):
  69. result.append(matrix.values[i * matrix.n + j])
  70. matrix.values = result
  71. matrix.m, matrix.n = matrix.n, matrix.m
  72. matrix.name = f'{name}^T'
  73. return matrix
  74.  
  75. def subtract_matrices(self, name1, name2):
  76.  
  77. matrix1 = next(matrix for matrix in self.matrices if matrix.name == name1)
  78. matrix2 = next(matrix for matrix in self.matrices if matrix.name == name2)
  79. if matrix1.m != matrix2.m or matrix1.n != matrix2.n:
  80. raise ValueError('Cele două matrice trebuie să aibă aceleași dimensiuni')
  81. result = [matrix1.values[i] - matrix2.values[i] for i in range(len(matrix1.values))]
  82. return Matrix(f'{name1}-{name2}', matrix1.m, matrix1.n, result)
  83.  
  84. def proprocess_transpose(self, ops):
  85.  
  86. ops = ops.split()
  87. remove_idxs = []
  88. for i in range(len(ops)):
  89.  
  90. if ops[i] == 't':
  91. name = ops[i - 1]
  92. matrix = self.flip_matrix(name)
  93.  
  94. name = name + '^T'
  95.  
  96. self.matrices[self.matrices.index(next(m for m in self.matrices if m.name == name))] = matrix
  97. remove_idxs.append(i)
  98. ops[i-1] = f'{name}'
  99.  
  100. ops = [ops[i] for i in range(len(ops)) if i not in remove_idxs]
  101. return ' '.join(ops)
  102.  
  103. def custom_input(self, ops):
  104.  
  105. ops = self.proprocess_transpose(ops)
  106.  
  107. ops = ops.split()
  108.  
  109. name = ops[0]
  110.  
  111. matrix = next(m for m in self.matrices if m.name == name)
  112. #print(locals())
  113. for i in range(1, len(ops), 2):
  114. op = ops[i]
  115. if op == 's':
  116. scalar = int(ops[i + 1])
  117. matrix = self.scalar_multiply(matrix.name, scalar)
  118. self.matrices[self.matrices.index(next(m for m in self.matrices if m.name == matrix.name))] = matrix
  119. elif op == '+':
  120. name2 = ops[i + 1]
  121. matrix2 = next(matrix for matrix in self.matrices if matrix.name == name2)
  122. matrix = self.add_matrices(matrix.name, matrix2.name)
  123. self.matrices.append(matrix)
  124. elif op == '-':
  125. name2 = ops[i + 1]
  126. matrix2 = next(matrix for matrix in self.matrices if matrix.name == name2)
  127. matrix = self.subtract_matrices(matrix.name, matrix2.name)
  128. self.matrices.append(matrix)
  129. return matrix
  130. def print_menu():
  131. print('1. Creați matrice')
  132. print('2. Înmulțiți matrice')
  133. print('3. Înmulțire scalară')
  134. print('4. Adăugați matrice')
  135. print('5. Scăderea matricilor')
  136. print('6. Flip Matrix')
  137. print('7. Intrare personalizată')
  138. print('8. Ieșire')
  139. def main():
  140. matrix_multiplier = MatrixMultiplier()
  141. while True:
  142. print_menu()
  143. choice = input('Introdu alegerea ta: ')
  144. if choice == '1':
  145. name = input('Introduceți numele matricei: ')
  146. matrix_multiplier.create_matrix(name)
  147. elif choice == '2':
  148. name1 = input('Introduceți numele primei matrice: ')
  149. name2 = input('Introduceți numele celei de-a doua matrice: ')
  150. try:
  151. result = matrix_multiplier.multiply_matrices(name1, name2)
  152. print(result)
  153. except ValueError as e:
  154. print(e)
  155. elif choice == '3':
  156. name = input('Introduceți numele primei matrice: ')
  157. scalar = int(input('Introduceți scalarul: '))
  158. result = matrix_multiplier.scalar_multiply(name, scalar)
  159. print(result)
  160. elif choice == '4':
  161. name1 = input('Introduceți numele primei matrice: ')
  162. name2 = input('Introduceți numele celei de-a doua matrice: ')
  163. try:
  164. result = matrix_multiplier.add_matrices(name1, name2)
  165. print(result)
  166. except ValueError as e:
  167. print(e)
  168. elif choice == '5':
  169. name1 = input('Introduceți numele primei matrice: ')
  170. name2 = input('Introduceți numele celei de-a doua matrice: ')
  171. try:
  172. result = matrix_multiplier.subtract_matrices(name1, name2)
  173. print(result)
  174. except ValueError as e:
  175. print(e)
  176. elif choice == '6':
  177. name = input('Introduceți numele matrice: ')
  178. result = matrix_multiplier.flip_matrix(name)
  179. print(result)
  180. elif choice == '7':
  181. update_con = input('Vrei sa salvezi noile valori?: ')
  182. if update_con in ['yes', 'da', 'y']:
  183. update_con = 1
  184. operations = input('Introduceți succesiunea operațiilor cu matrice: ')
  185. try:
  186. result = matrix_multiplier.custom_input(operations)
  187. print(result)
  188. except (ValueError, IndexError) as e:
  189. print(e)
  190. else:
  191. print('Alegere nevalidă')
  192. if __name__ == "__main__":
  193. main()
Advertisement
Add Comment
Please, Sign In to add comment