|
1 | 1 | from __future__ import print_function
|
2 | 2 |
|
| 3 | + |
3 | 4 | def add(matrix_a, matrix_b):
|
4 |
| - rows = len(matrix_a) |
5 |
| - columns = len(matrix_a[0]) |
| 5 | + try: |
| 6 | + rows = [len(matrix_a), len(matrix_b)] |
| 7 | + cols = [len(matrix_a[0]), len(matrix_b[0])] |
| 8 | + except TypeError: |
| 9 | + raise TypeError("Cannot input an integer value, it must be a matrix") |
| 10 | + |
| 11 | + if rows[0] != rows[1] & cols[0] != cols[1]: |
| 12 | + raise ValueError(f"operands could not be broadcast together with shapes " |
| 13 | + f"({rows[0],cols[0]}), ({rows[1], cols[1]})") |
| 14 | + |
6 | 15 | matrix_c = []
|
7 |
| - for i in range(rows): |
| 16 | + for i in range(rows[0]): |
8 | 17 | list_1 = []
|
9 |
| - for j in range(columns): |
| 18 | + for j in range(cols[0]): |
10 | 19 | val = matrix_a[i][j] + matrix_b[i][j]
|
11 | 20 | list_1.append(val)
|
12 | 21 | matrix_c.append(list_1)
|
13 | 22 | return matrix_c
|
14 | 23 |
|
15 |
| -def scalarMultiply(matrix , n): |
| 24 | + |
| 25 | +def subtract(matrix_a, matrix_b): |
| 26 | + try: |
| 27 | + rows = [len(matrix_a), len(matrix_b)] |
| 28 | + cols = [len(matrix_a[0]), len(matrix_b)] |
| 29 | + except TypeError: |
| 30 | + raise TypeError("Cannot input an integer value, it must be a matrix") |
| 31 | + |
| 32 | + if rows[0] != rows[1] & cols[0] != cols[1]: |
| 33 | + raise ValueError(f"operands could not be broadcast together with shapes " |
| 34 | + f"({rows[0], cols[0]}), ({rows[1], cols[1]})") |
| 35 | + |
| 36 | + matrix_c = [] |
| 37 | + for i in range(rows[0]): |
| 38 | + list_1 = [] |
| 39 | + for j in range(cols[0]): |
| 40 | + val = matrix_a[i][j] - matrix_b[i][j] |
| 41 | + list_1.append(val) |
| 42 | + matrix_c.append(list_1) |
| 43 | + return matrix_c |
| 44 | + |
| 45 | + |
| 46 | +def scalar_multiply(matrix, n): |
16 | 47 | return [[x * n for x in row] for row in matrix]
|
17 | 48 |
|
| 49 | + |
18 | 50 | def multiply(matrix_a, matrix_b):
|
19 | 51 | matrix_c = []
|
20 |
| - n = len(matrix_a) |
21 |
| - for i in range(n): |
| 52 | + num_rows_a = len(matrix_a) |
| 53 | + num_cols_a = len(matrix_a[0]) |
| 54 | + num_rows_b = len(matrix_b) |
| 55 | + num_cols_b = len(matrix_b[0]) |
| 56 | + |
| 57 | + if num_cols_a != num_rows_b: |
| 58 | + raise ValueError(f'Cannot multiply matrix of dimensions ({num_rows_a},{num_cols_a}) ' |
| 59 | + f'and ({num_rows_b},{num_cols_b})') |
| 60 | + |
| 61 | + for i in range(num_rows_a): |
22 | 62 | list_1 = []
|
23 |
| - for j in range(n): |
| 63 | + for j in range(num_cols_b): |
24 | 64 | val = 0
|
25 |
| - for k in range(n): |
| 65 | + for k in range(num_cols_b): |
26 | 66 | val = val + matrix_a[i][k] * matrix_b[k][j]
|
27 | 67 | list_1.append(val)
|
28 | 68 | matrix_c.append(list_1)
|
29 | 69 | return matrix_c
|
30 | 70 |
|
| 71 | + |
31 | 72 | def identity(n):
|
32 | 73 | return [[int(row == column) for column in range(n)] for row in range(n)]
|
33 | 74 |
|
| 75 | + |
34 | 76 | def transpose(matrix):
|
35 |
| - return map(list , zip(*matrix)) |
| 77 | + return map(list, zip(*matrix)) |
| 78 | + |
36 | 79 |
|
37 | 80 | def minor(matrix, row, column):
|
38 | 81 | minor = matrix[:row] + matrix[row + 1:]
|
39 | 82 | minor = [row[:column] + row[column + 1:] for row in minor]
|
40 | 83 | return minor
|
41 | 84 |
|
| 85 | + |
42 | 86 | def determinant(matrix):
|
43 |
| - if len(matrix) == 1: return matrix[0][0] |
| 87 | + if len(matrix) == 1: |
| 88 | + return matrix[0][0] |
44 | 89 |
|
45 | 90 | res = 0
|
46 | 91 | for x in range(len(matrix)):
|
47 |
| - res += matrix[0][x] * determinant(minor(matrix , 0 , x)) * (-1) ** x |
| 92 | + res += matrix[0][x] * determinant(minor(matrix, 0, x)) * (-1) ** x |
48 | 93 | return res
|
49 | 94 |
|
| 95 | + |
50 | 96 | def inverse(matrix):
|
51 | 97 | det = determinant(matrix)
|
52 |
| - if det == 0: return None |
| 98 | + if det == 0: |
| 99 | + return None |
53 | 100 |
|
54 |
| - matrixMinor = [[] for _ in range(len(matrix))] |
| 101 | + matrix_minor = [[] for _ in range(len(matrix))] |
55 | 102 | for i in range(len(matrix)):
|
56 | 103 | for j in range(len(matrix)):
|
57 |
| - matrixMinor[i].append(determinant(minor(matrix , i , j))) |
| 104 | + matrix_minor[i].append(determinant(minor(matrix, i, j))) |
58 | 105 |
|
59 |
| - cofactors = [[x * (-1) ** (row + col) for col, x in enumerate(matrixMinor[row])] for row in range(len(matrix))] |
| 106 | + cofactors = [[x * (-1) ** (row + col) for col, x in enumerate(matrix_minor[row])] for row in range(len(matrix))] |
60 | 107 | adjugate = transpose(cofactors)
|
61 |
| - return scalarMultiply(adjugate , 1/det) |
62 |
| - |
63 |
| -def main(): |
64 |
| - matrix_a = [[12, 10], [3, 9]] |
65 |
| - matrix_b = [[3, 4], [7, 4]] |
66 |
| - matrix_c = [[11, 12, 13, 14], [21, 22, 23, 24], [31, 32, 33, 34], [41, 42, 43, 44]] |
67 |
| - matrix_d = [[3, 0, 2], [2, 0, -2], [0, 1, 1]] |
68 |
| - print('Add Operation, %s + %s = %s \n' %(matrix_a, matrix_b, (add(matrix_a, matrix_b)))) |
69 |
| - print('Multiply Operation, %s * %s = %s \n' %(matrix_a, matrix_b, multiply(matrix_a, matrix_b))) |
70 |
| - print('Identity: %s \n' %identity(5)) |
71 |
| - print('Minor of %s = %s \n' %(matrix_c, minor(matrix_c , 1 , 2))) |
72 |
| - print('Determinant of %s = %s \n' %(matrix_b, determinant(matrix_b))) |
73 |
| - print('Inverse of %s = %s\n'%(matrix_d, inverse(matrix_d))) |
| 108 | + return scalar_multiply(adjugate, 1/det) |
| 109 | + |
74 | 110 |
|
75 | 111 | if __name__ == '__main__':
|
76 |
| - main() |
| 112 | + mat_a = [[12, 10], [3, 9]] |
| 113 | + mat_b = [[3, 4], [7, 4]] |
| 114 | + mat_c = [[11, 12, 13, 14], [21, 22, 23, 24], [31, 32, 33, 34], [41, 42, 43, 44]] |
| 115 | + mat_d = [[3, 0, 2], [2, 0, -2], [0, 1, 1]] |
| 116 | + print('Add Operation, %s + %s = %s \n' %(mat_a, mat_b, (add(mat_a, mat_b)))) |
| 117 | + print('Multiply Operation, %s * %s = %s \n' %(mat_a, mat_b, multiply(mat_a, mat_b))) |
| 118 | + print('Identity: %s \n' %identity(5)) |
| 119 | + print('Minor of %s = %s \n' %(mat_c, minor(mat_c , 1 , 2))) |
| 120 | + print('Determinant of %s = %s \n' %(mat_b, determinant(mat_b))) |
| 121 | + print('Inverse of %s = %s\n'%(mat_d, inverse(mat_d))) |
0 commit comments