From 18012e5f9013ac4a289d0acaec50294f02c8ff3d Mon Sep 17 00:00:00 2001 From: 6440e7113916fa54ba548fe6 <6440e7113916fa54ba548fe6@devide> Date: Sun, 30 Apr 2023 05:28:47 +0000 Subject: [PATCH] Auto commit --- Matrix.py | 194 ++++++++++++++++++++++++++++++ __pycache__/Matrix.cpython-38.pyc | Bin 0 -> 9796 bytes main.py | 63 +++++++++- 3 files changed, 256 insertions(+), 1 deletion(-) create mode 100644 Matrix.py create mode 100644 __pycache__/Matrix.cpython-38.pyc diff --git a/Matrix.py b/Matrix.py new file mode 100644 index 0000000..610d6e7 --- /dev/null +++ b/Matrix.py @@ -0,0 +1,194 @@ +import copy + +class Matrix: + def __init__(self, matrix): + # 列表类型检查 + assert isinstance(matrix, list), "参数必须为二维列表!" + for row in matrix: + assert isinstance(row, list), "参数必须为二维列表!" + for row in matrix: + assert len(row) == len(matrix[0]), "参数第二维度不一致!" + for row in matrix: + for each in row: + assert isinstance(each, (int, float, complex)), "元素类型只能为int, float或complex!" + self.__matrix = matrix + self.__row = len(matrix) + self.__col = len(matrix[0]) + + # 矩阵间加法 + + def __add__(self, other): + assert isinstance(other, Matrix), "加数必须是 Matrix 类" + if self.__row != other.__row or self.__col != other.__col: + raise ValueError("两矩阵维度不一致!") + result = Matrix( [[0 for i in range(self.__col)] for i in range( self.__row ) ] ) + for i in range(self.__row): + for j in range(self.__col): + result.__matrix[i][j] = self.__matrix[i][j] + other.__matrix[i][j] + return result + + # 矩阵间减法 - + def __sub__(self, other): + assert isinstance(other, Matrix), "加数必须是 Matrix 类" + if self.__row != other.__row or self.__col != other.__col: + raise ValueError("两矩阵维度不一致!") + result = Matrix([[0 for i in range(self.__col)] for i in range(self.__row)]) + for i in range(self.__row): + for j in range(self.__col): + result.__matrix[i][j] = self.__matrix[i][j] - other.__matrix[i][j] + return result + # 矩阵乘矩阵 * + def __mul__(self, other): + assert isinstance(other, Matrix), "右乘数必须是 Matrix 类" + if self.__col != other.__row: + raise ValueError("两矩阵维度不一致!") + result = Matrix([[0 for i in range(other.__col)] for i in range(self.__row)]) + for i in range(self.__row): + for j in range(other.__col): + for m in range(self.__col): + result.__matrix[i][j] += self.__matrix[i][m] * other.__matrix[m][j] + return result + # 数与矩阵乘 * + def __rmul__(self, other): + assert isinstance(other, (int, float, complex)), "左乘系数类型错误" + result = Matrix([[0 for i in range(self.__col)] for i in range(self.__row)]) + for i in range(self.__row): + for j in range(self.__col): + result.__matrix[i][j] = self.__matrix[i][j] * other + return result + # 矩阵除以数 + def __truediv__(self, other): + assert isinstance(other, (int, float, complex)), "被除数系数类型错误" + result = Matrix([[0 for i in range(self.__col)] for i in range(self.__row)]) + for i in range(self.__row): + for j in range(self.__col): + result.__matrix[i][j] = self.__matrix[i][j] / other + return result + # 数除以矩阵 + def __rtruediv__(self, other): + assert isinstance(other, (int, float, complex)), "除数系数类型错误" + result = Matrix([[0 for i in range(self.__col)] for i in range(self.__row)]) + for i in range(self.__row): + for j in range(self.__col): + result.__matrix[i][j] = other / self.__matrix[i][j] + return result + # 矩阵与矩阵元素是否相等 + def __eq__(self, other): + assert isinstance(other, Matrix), "必须是 Matrix 类" + for i in range(self.__row): + for j in range(self.__col): + if self.__matrix[i][j] != other.__matrix[i][j]: + return False + return True + # 矩阵字符化 + def __str__(self): + return '\n'.join(list(map(str, self.__matrix))) + # 行迭代器 + def __iter__(self): + return self.__matrix.__iter__() + # 元素获取,看齐numpy + def __getitem__(self, item): + if isinstance(item, int): + return self.__matrix[item] + if isinstance(item, tuple): + row, col = item[0], item[1] + if isinstance(row, int) and isinstance(col, int): + return self.__matrix[row][col] + if isinstance(row, slice) and isinstance(col, int): + return Matrix( [ [ line[col] ] for line in self.__matrix[row]] ) + if isinstance(row, int) and isinstance(col, slice): + return Matrix( [self.__matrix[row][col]] ) + if isinstance(row, slice) and isinstance(col, slice): + return Matrix( [ line[col] for line in self.__matrix[row] ] ) + # len() + def __len__(self): + return (self.__row)*(self.__col) + + # 析构函数 + def __del__(self): + del self.__matrix + # def __copy__(self): + # 元素和 + def sum(self): + value = 0 + for i in range(self.__row): + for j in range(self.__col): + value += self.__matrix[i][j] + return value + + # 某行某列的代数余子式 + def cofacor(self, row, col): + assert self.__row == self.__col, "必须是方阵" + mat_1 = copy.deepcopy(self) + temp_mat = [] + # 删除对应行和列 + for row_index, line in enumerate(mat_1): + if row_index == row: + continue + line.pop(col) + temp_mat.append(line) + return pow(-1, row+col+2) * Matrix(temp_mat).det() + + # 定义法迭代法行列式 + def det(self): + assert self.__row == self.__col, "必须是方阵" + if self.__row == 1 and self.__col == 1: + return self.__matrix[0][0] + if self.__row == 2 and self.__col == 2: + return self.__matrix[0][0]*self.__matrix[1][1] - self.__matrix[0][1]*self.__matrix[1][0] + # 取出第一行与之代数余子式相乘 + value = 0 + for col_index, m in enumerate(self.__matrix[0]): + value += m * copy.deepcopy(self).cofacor(0, col_index) + return value + # 当前矩阵的伴随矩阵 + def adj(self): + assert self.__row == self.__col, "必须是方阵" + result = [[0 for i in range(self.__col)] for i in range(self.__row)] + for i in range(self.__row): + for j in range(self.__col): + result[i][j] = self.cofacor(j,i) + return Matrix(result) + # 矩阵的逆 + def inv(self): + assert self.__row == self.__col, "必须是方阵" + det = self.det() + assert det != 0, "矩阵必须非奇异" + return self.adj() / det + # 矩阵转置 + def transpose(self): + return Matrix(list(map(list, zip(*self.__matrix)))) + + # 矩阵的秩 + def rank(self): + def col_sort(mat, col_index = 0): + assert isinstance(mat, Matrix), "对象必须为矩阵" + temp_mat = Matrix( sorted(mat.__matrix, key=lambda x:abs(x[col_index]), reverse=True) ) + return temp_mat + def cal_col_k(mat, col_index=0): + assert isinstance(mat, Matrix), "对象必须为矩阵" + k = [[0] for i in range(mat.__row)] + if abs(mat.__matrix[0][col_index]) < 1e-9: + return 0, None + for i in range(1,mat.__row): + k[i][0] = mat.__matrix[i][col_index] / mat.__matrix[0][col_index] + return 1, Matrix(k) + def elimination(mat, k): + assert isinstance(mat, Matrix), "对象必须为矩阵" + temp_mat = [[0 for col in range(mat.__col)] for j in range(mat.__row) ] + for i in range(mat.__row): + for j in range(mat.__col): + temp_mat[i][j] = mat.__matrix[i][j] -( mat.__matrix[0][j] * k[i][0]) + return Matrix(temp_mat) + + mat = copy.deepcopy(self) + # 列排序 + mat = col_sort(mat, col_index=0) + if mat.__col == 1 or mat.__row == 1: + return int(bool(abs(mat.sum()))) + # 列比例 + ret, K = cal_col_k(mat, col_index=0) + if ret == 0: + return mat[1:,1:].rank() + # 消源 + mat = elimination(mat, K) + return 1 + mat[1:,1:].rank() diff --git a/__pycache__/Matrix.cpython-38.pyc b/__pycache__/Matrix.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c1818654f5981b551f3cb3d9cfdef4b7dbadbf0e GIT binary patch literal 9796 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 literal 0 HcmV?d00001 diff --git a/main.py b/main.py index 4c0c135..33061fb 100644 --- a/main.py +++ b/main.py @@ -1 +1,62 @@ -print('欢迎来到 InsCode') \ No newline at end of file +from Matrix import Matrix + + + + +print('欢迎来到 InsCode') +print('以下为矩阵实现演示...') + + + + +print('矩阵变量'.center(50,'-')) +A = Matrix( [ [1, 2, 2], + [2, 3, 2], + [2, 2, 3]]) + +M = Matrix([ [0], + [0], + [2]]) + +B = Matrix( [ [1, 2, 3], + [3, 2, -1], + [2, 2, 2]] ) +print("A:") +print(A) +print("M:") +print(M) +print("B:") +print(B) + + +# 加法 +print("矩阵加法:A+B".center(50, '-')) +print(A + B) +print("矩阵减法:A-B".center(50,'-')) +print(A - B) +print("矩阵乘法:A*B".center(50, '-')) +print(A * B) +print("数乘矩阵:10*B".center(50, '-')) +print(10 * B) +print("矩阵除以数:A/10".center(50, '-')) +print(A / 10) +print("数除以矩阵(元素):10/B".center(50, '-')) +print(10 / B) +print("矩阵元素访问(副本):A[1:, 1:]".center(50,'-')) +print(A[1:, 1:]) + +print("代数余子式:A.cofacor(0, 0)".center(50, '-')) +print(A.cofacor(0, 0)) +print("行列式:A.det()".center(50, '-')) +print(A.det()) +print("伴随矩阵:A.adj()".center(50, '-')) +print(A.adj()) +print("矩阵逆:A.inv()".center(50, '-')) +print(A.inv()) +print("矩阵转置:A.transpose()".center(50, '-')) +print(A.transpose()) +print("矩阵秩:A.rank()".center(50, '-')) +print(A.rank()) + + + -- GitLab