commit 52c634a472cb651b1c9962c5ec1e823f6e26451e Author: Sirin Puenggun Date: Tue Nov 1 02:22:36 2022 +0700 Initial Commit diff --git a/matrix.py b/matrix.py new file mode 100644 index 0000000..22ba6ad --- /dev/null +++ b/matrix.py @@ -0,0 +1,133 @@ +class Matrix: + """ + We will write matrix in form of nd-array + + Example: + - [[1, 2], [3, 4]] is a 2x2 Matrix (row x column) + - [[1, 2]] is 1x2 Matrix + """ + + def __init__(self, array: list): + self.array = array + self.row = len(array) + self.column = len(array[0]) + + def __add__(self, other): + """ + Add matrix up and those matrix need same dimesional. + >>> m1 = Matrix([[1, 2], [3, 4]]) + >>> m2 = Matrix([[1, 2], [3, 4]]) + >>> m3 = m1 + m2 + >>> m3.array + [[2, 4], [6, 8]] + """ + + if (self.row != other.row) and (self.column != other.column): + raise ValueError("Need matrix with same dimesional when add matrix up.") + for row_index in range(self.row): + for column_index in range(self.column): + self.array[row_index][column_index] += other.array[row_index][column_index] + return self + + def __sub__(self, other): + """ + Substract matrix up and those matrix need same dimesional. + >>> m1 = Matrix([[1, 2], [3, 4]]) + >>> m2 = Matrix([[1, 2], [3, 4]]) + >>> m3 = m1 - m2 + >>> m3.array + [[0, 0], [0, 0]] + """ + + if (self.row != other.row) and (self.column != other.column): + raise ValueError("Need matrix with same dimesional when add matrix up.") + for row_index in range(self.row): + for column_index in range(self.column): + self.array[row_index][column_index] -= other.array[row_index][column_index] + return self + + def __mul__(self, other): + """ + Multiply matrix up and those matrix need same dimesional. + >>> m1 = Matrix([[1, 2], [3, 4]]) + >>> m2 = Matrix([[1, 2], [3, 4]]) + >>> m3 = m1 * m2 + >>> m3.array + [[7, 10], [15, 22]] + """ + if self.column == other.row: + new_matrix = Matrix([[0 for i in range(other.column)] for k in range(self.row)]) + for row_index in range(self.row): + for col_index in range(self.column): + for k in range(other.row): + new_matrix.array[row_index][col_index] += self.array[row_index][k] * other.array[k][col_index] + return new_matrix + else: + raise ValueError("Can't multiply these matrix") + + def copy_matrix(self): + """ + >>> m = Matrix([[1,2]]) + >>> m2 = m.copy_matrix() + >>> m2 is m + False + """ + arr = self.array + new_matrix = Matrix(arr) + return new_matrix + + def determinant(self): + """ + Find determinant of Square Matrix + >>> m1 = Matrix([[1,2,3],[1,2,3],[1,2,3]]) + >>> d = m1.determinant() + >>> d + 0 + """ + if self.row != self.column: + raise ValueError(f"Can't Find determinant of {self.row} x {self.column} Matrix") + + if self.row == 2 and self.column == 2: + return self.array[0][0] * self.array[1][1] - self.array[1][0] * self.array[0][1] + + value = 0 + index_cut_column = [range(self.row)] + + for column_to_cut in index_cut_column: + temp_matrix = self.copy_matrix() + temp_matrix.array = temp_matrix.array[1:] + row_count = len(temp_matrix.array) + + for row_index in range(row_count): + temp_matrix.array[row_index] = temp_matrix.array[row_index][0:column_to_cut] + temp_matrix.array[row_index][column_to_cut+1:] + + coeff_sign = (-1) * (column_to_cut % 2) + sub_determinant = temp_matrix.determinant() + value = coeff_sign * self.array[0][column_to_cut] * sub_determinant + return value + + def tranpose(self): + """ + Substract matrix up and those matrix need same dimesional. + >>> m1 = Matrix([[1, 2, 3], [3, 4, 5]]) + >>> m1 = m1.tranpose() + >>> m1.array + [[1, 3], [2, 4], [3, 5]] + """ + new_matrix = Matrix([[0 for i in range(self.row)] for k in range(self.column)]) + for row_index in range(self.row): + for col_index in range(self.column): + new_matrix.array[col_index][row_index] += self.array[row_index][col_index] + return new_matrix + + def inverse(self): + pass + + def __str__(self): + return f'Matrix({self.array})' + +if __name__ == "__main__": + import doctest + doctest.testmod() + # Use the following line INSTEAD if you want to print all tests anyway. + # doctest.testmod(verbose = True) \ No newline at end of file