矩阵计算器
设计一款矩阵计算器。要求如下:
语言:Python。
允许使用numpy。
基本要求:
进行相关矩阵的计算,包括转置、求和、求逆、求行列式和乘积。
进阶要求:
一次最多可以定义十个矩阵。
创建“收藏夹”,用于存放用户定义的矩阵,且用户可以随时查看它。
进行相关矩阵的计算,包括转置、求和、求逆、求行列式和乘积。
进行“3.”后生成的矩阵可以被作为新矩阵添加至“收藏夹”或替换原先生成的矩阵。
高阶要求:
在“进阶要求”的基础上,不允许使用numpy。
#!/usr/bin/env python# coding: utf-8import numpy as npfrom numpy import *print('------测试------\n')num_lineA = input('请输入矩阵A的行数:3')num_columnA = input('请输入矩阵A的列数:4')print('......\n')a = np.arange(12).reshape(3,4)print('矩阵A为:\n',a)num_lineB = input('请输入矩阵B的行数:2')num_columnB = input('请输入矩阵B的列数:2')print('......\n')b = np.mat([[1, 2],[3,4]])Z = []print(b)print(b*b)Z.append(a)Z.append(b)print(Z)print(Z[1])print('----测试完毕----\n')num_lineA = input('请输入矩阵A的行数:')num_columnA = input('请输入矩阵A的列数:')la = int(num_lineA)ca = int(num_columnA)Ac = []Hc = []Dx = {}S = []for i in range(1,la+1): for c in range(1,ca+1): t = input('请输入A的第%s行的第%s个数:' %(i,c)) Hc.append(int(t)) Ac.append(Hc) Hc = [] print(Ac)M_A = np.mat(Ac)print('A矩阵为:\n',M_A)S.append(M_A)Dx['A'] = M_AV = ['B','C','D','E','F','G','H','I','J']VV = ['A','B','C','D','E','F','G','H','I','J']Dc = ['1','2','3','4','5','6','7','8','9']text = input('好家伙,你已经成功定义了一个矩阵A,它已经在你的收藏夹中了!那么下面你想做什么?\na.再定义一个矩阵\nb.查看收藏的矩阵\nc.进入工作台\n')while text: for i in range(len(V)): v = V[i] if text == 'a': num_line = input('请输入矩阵%s的行数:' %v) num_column = input('请输入矩阵%s的列数:' %v) la = int(num_line) ca = int(num_column) for i in range(1,la+1): for c in range(1,ca+1): t = input('请输入%s的第%s行的第%s个数:' %(v,i,c)) Hc.append(int(t)) Ac.append(Hc) print(Ac) M_X = np.mat(Ac) print('矩阵%s为:\n' %v ,M_X) S.append(M_X) Dx[v] = M_X text = input('好家伙,你又成功定义了一个矩阵%s,它已经在你的收藏夹中了!那么下面你还想做什么?\na.再定义一个矩阵\nb.查看收藏的矩阵\nc.进入工作台\n' %v) break if text == 'b': print('A矩阵为:\n',M_A) for k in range(len(S)): if len(S) ==1: break else: vt = V[k] print('%s矩阵为:\n' %vt, S[k+1]) print(k,len(S)) if k == len(S)-2: fk = k break print(Dx) #关注一下字典里矩阵和数组的表示 text = input('好家伙,你也配看收藏夹?自己定义了什么矩阵自己记不得吗?你还会个啥?\na.再定义一个矩阵\nb.我再看看收藏的矩阵\nc.进入工作台\n') break if text =='c': wx = input('\n【工作台】\n好的,下面你想做点什么?\na.对收藏夹中的单个矩阵进行变换和更新\nb.对多个矩阵进行运算\nc.返回并定义新矩阵\n') while wx: if wx == 'c': text = input('来!\na.定义新矩阵\nb.查看收藏夹\n') break break if wx == 'a' or wx == 'b': pass else: zz = input('你可真烂!我直接好家伙!\n') wx = input('人干事?\na.对收藏夹中的单个矩阵进行变换和更新\nb.对多个矩阵进行运算\nc.返回并定义新矩阵\n') else: zz = input('你可真烂!\给你点赞\n') text = input('别当机掰人!\na.再定义一个矩阵\nb.查看收藏的矩阵\nc.进入工作台\n')while wx: print('【临时收藏夹】---\n') if wx == 'a': for b in range(len(Dx)): print('%s = %s\n' %(VV[b],Dx[VV[b]])) if b == len(Dx): break print('--------') c1 = input('【单个矩阵的变换和更新】\n请选择需要被操作的矩阵:\n') while c1: if c1 == 'A': u1 = S[0] break elif c1 in V: u1 = S[V.index(c1)+1] break else: zx = input('啊这......') c1 = input('【单个矩阵的变换和更新】\n请认真选择需要被操作的矩阵:\n') print('--------\n【单个矩阵的变换和更新】\n%s = %s\n' %(c1,u1)) wy = input('你要对其进行:\na.转置\nb.求逆\nc.求对应行列式的值\nd.') while wy: if wy == 'a': v1 = u1.T print('%s的转置结果为:\n' %c1 , v1) za = input('【临时工作台】\n现在可以立刻对其进行操作:\na.替换掉原来的矩阵\nb.将其添加到收藏夹\nc.不操作\n') print('b = %s' %b) while za: if za == 'a': Dx[c1] = v1 print(Dx) break if za =='b': Dx[V[b]] = v1 print(Dx) elif wy == 'b': v1 judge = input('下面你想做什么?\na.转置它\nb.对其求逆\nc.求对应行列式的值\nd.进行矩阵相乘\ne.退出\n')while judge: print(judge) if judge== 'a': x = M_A.T print('转置后的结果为:\n%s' %M_A.T) print('A矩阵为:\n',M_A) judge = input('下面你想做什么?\na.转置它\nb.对其求逆\nc.求|A|\nd.进行矩阵相乘\ne.更新A矩阵f.退出\n') if judge == 'e': M_A = x print('已更新!现在A矩阵为:\n',M_A) judge = input('下面你想做什么?\na.转置它\nb.对其求逆\nc.求|A|\nd.进行矩阵相乘\ne.更新A矩阵\nf.退出\n') if judge=='b': print('A的逆矩阵为:\n%s' %M_A.I) print('---------------------\n') print('A矩阵为:\n',M_A) judge = input('下面你想做什么?\na.转置它\nb.对其求逆\nc.求|A|\nd.进行矩阵相乘\ne.退出\n') if judge=='c': print('A对应行列式的值为:%s' %np.linalg.det(M_A)) print('---------------------\n') print('A矩阵为:\n',M_A) judge = input('下面你想做什么?\na.转置它\nb.对其求逆\nc.求|A|\nd.进行矩阵相乘\ne.退出\n')#To Be Continued
后面实在是做不下去了,感觉程序架构出了点问题,主要是练一练循环和迭代。
问题:
越往后循环嵌套越复杂,且经常容易跳转不到自己需要的循环,正在分析原因。
88行输入"b"程序无响应,输入"a","c"可以正常运行。
93行的"pass"在实际运行中没有起到应有的效果。且"i"值仍然在不断增加。
考虑如何可以定义理论上无穷个矩阵,而不靠英文字母来一个一个代替,能否利用字典来使代码形式更加简洁?
目前想到的解决办法就是把“收藏夹”、“工作台”的各个功能全部进行封装,到时候直接调用之。这样逻辑顺序应该会更加清晰明确。
部分实现展示: