zoukankan      html  css  js  c++  java
  • 基于numpy实现矩阵计算器

    要求

    制作一个Python的矩阵计算器:

    ① 程序提供任意两矩阵的加、乘法运算;方阵的行列式计算、逆矩阵计算、特征分解;任意矩阵的转置等计算功能,可自行添加功能

    ② 从控制台通过键盘获取数据并完成以上的计算,不强制要求异常检测

    ③ 使用8组以上的非典型数据(如对角矩阵,单位矩阵等)进行测试并完成计算结果记录

    代码要求:

    ① 有完整的输入输出提示与代码注释

    ② 至少具备题目要求所述功能

    ③ 能够正确输出运算结果

    代码

    import numpy as np
    import os
    import time
    
    '''
     1. 矩阵相加:   shape
     2. 矩阵相乘:   shape
     3. 行列式计算   x = y
     4. 逆矩阵计算   det != 0
     5. 特征分解     x = y
     6. 矩阵的转置   None
     7. 矩阵相减     shape
     8. 矩阵相除     shape
     9. 矩阵对应相乘 shape
     10. 奇异值分解  
    '''
    
    class MatCal:
        """用来进行两个矩阵进行的操作"""
        def __init__(self,mat1,mat2):
            self.__mat1 = mat1
            self.__mat2 = mat2
            
        def add(self):
            if self.__mat1.shape != self.__mat2.shape:
                print("两个待相加矩阵的shape不一致,无法操作")
                return None
            else:
                return self.__mat1 + self.__mat2
            
        def multi(self):
            """矩阵对应相乘"""
            if self.__mat1.shape != self.__mat2.shape:
                print("两个待相乘矩阵的shape不满足要求,无法操作")
                return None
            return self.__mat1 * self.__mat2
        
        def matmulti(self):
            """矩阵相乘"""
            if self.__mat1.shape[1] != self.__mat2.shape[0]:
                print("两个待相乘矩阵的shape不满足要求,无法操作")
                return None
            return np.matmul(self.__mat1,self.__mat2)
        
        def sub(self):
            """矩阵相减"""
            if self.__mat1.shape != self.__mat2.shape:
                print("两个待相减矩阵的shape不满足要求,无法操作")
                return None
            return self.__mat1 - self.__mat2
        def divide(self):
            """矩阵相减"""
            if self.__mat1.shape != self.__mat2.shape:
                print("两个待相除矩阵的shape不满足要求,无法操作")
                return None
            return self.__mat1 / self.__mat2
        
        
    class MatCom:
        """用来进行一个矩阵进行操作"""
        def __init__(self,mat):
            self.__mat = mat
            
        def det(self):
            """计算行列式"""
            if self.__mat.shape[0] != self.__mat.shape[1]:
                print("矩阵行列数目应该相等")
                return None
            return np.linalg.det(self.__mat)
        
        def invert(self):
            """计算逆矩阵"""
            if self.det() != None and self.det() != 0:
                return np.linalg.inv(self.__mat)
            else:
                return None
        
        def eigs(self):
            """计算矩阵特征分解"""
            if self.__mat.shape[0] != self.__mat.shape[1]:
                print("矩阵行列数目应该相等")
                return None
            return np.linalg.eig(self.__mat)# 1. 特征值, 2.特征向量
        
        def svds(self):
            """矩阵奇异值分解"""
            return np.linalg.svd(self.__mat)# 1.左奇异 2.奇异值 3. 右奇异
        
        def trans(self):
            """矩阵的转置"""
            return self.__mat.T
            
    def mkMat(row, col):
        """根据row,col进行矩阵的构造"""
        print("----start----")
        arr = []
        for i in range(row):
            tmp_arr = []
            r = input("请输入第{:d}行内容:".format(i+1))
            tmp = r.split()
            while len(tmp) != col:
                print("您输入尺寸大小不正确,长度应该为:{:d}".format(col))
                r = input("请输入第{:d}行内容:".format(i+1))
                tmp = r.split()
            for j in range(col):
                tmp_arr.append(float(tmp[j]))
            arr.append(tmp_arr)
        print("----end----")
        return np.array(arr,dtype=np.float32)
    
    def printMat(mat):
        for i in range(mat.shape[0]):
            for j in range(mat.shape[1]):
                print("	{:.1f}".format(mat[i][j]),end="")
            print()
    
    def show2Res(mat1,mat2,mat):
        print("矩阵:")
        printMat(mat1)
        print("和矩阵:")
        printMat(mat2)
        print("运算结果为:")
        printMat(mat)
    
    if __name__ == "__main__":
        str1 = "请输入想要的操作对应序号:
     1. 矩阵相加 
     2. 矩阵相乘 
     3. 行列式计算 
     4. 逆矩阵计算 
     5. 特征分解 
     6. 矩阵的转置
     "
        str2 = "7. 矩阵相减 
     8. 矩阵相除 
     9. 矩阵对应相乘 
     10. 奇异值分解 
     0. 退出 
     请输入:"
        while True:
            a = input(str1+str2)
            if a == "1":
                print("计算两个矩阵相加 (两个矩阵的大小需要一相同)")
                row1,col1 = input("请输入矩阵1的行:"),input("请输入矩阵1的列:")
                mat1 = mkMat(int(row1),int(col1))
                row2,col2 = input("请输入矩阵2的行:"),input("请输入矩阵2的列:")
                mat2 = mkMat(int(row2),int(col2))
                tmp = MatCal(mat1,mat2)
                if tmp != None:
                    show2Res(mat1,mat2,tmp.add())
            elif a == "2":
                print("计算两个矩阵相乘 (第一个矩阵的第二维与第二个矩阵的第一维需要相同)")
                row1,col1 = input("请输入矩阵1的行:"),input("请输入矩阵1的列:")
                mat1 = mkMat(int(row1),int(col1))
                row2,col2 = input("请输入矩阵2的行:"),input("请输入矩阵2的列:")
                mat2 = mkMat(int(row2),int(col2))
                tmp = MatCal(mat1,mat2)
                if tmp.matmulti() != None:
                    show2Res(mat1,mat2,tmp.matmulti())
            elif a == "3":
                print("下面进行行列式计算 (请输入一个矩阵)")
                row1,col1 = input("请输入矩阵的行:"),input("请输入矩阵的列:")
                mat = mkMat(int(row1),int(col1))
                tmp = MatCom(mat)
                if tmp.det() != None:    
                    print("矩阵:")
                    printMat(mat)
                    print("的行列式值为:{:.2f}".format(tmp.det()))
                else:
                    print("error:请重新输入")
            elif a == "4":
                print("进行逆矩阵运算(请输入一个矩阵)")
                row1,col1 = input("请输入矩阵的行:"),input("请输入矩阵的列:")
                mat = mkMat(int(row1),int(col1))
                tmp = MatCom(mat)
                if tmp.invert().all() != None:    
                    print("矩阵:")
                    printMat(mat)
                    print("的逆矩阵为")
                    printMat(tmp.invert())
                else:
                    print("error: 请重新输入")
            elif a == "5":
                print("进行矩阵特征分解(请输入一个矩阵)")
                row1,col1 = input("请输入矩阵的行:"),input("请输入矩阵的列:")
                mat = mkMat(int(row1),int(col1))
                tmp = MatCom(mat)
                print("矩阵:")
                printMat(mat)
                if tmp.eigs() != None:    
                    t1,t2 = tmp.eigs()
                    print("的矩阵特征值为:")
                    print(t1)
                    print("特征向量为:")
                    print(t2)
                else:
                    print("error:请重新输入")
            elif a == "6":
                print("进行矩阵转置运算(请输入一个矩阵)")
                row1,col1 = input("请输入矩阵的行:"),input("请输入矩阵的列:")
                mat = mkMat(int(row1),int(col1))
                tmp = MatCom(mat)
                print("矩阵:")
                printMat(mat)
                print("的转置矩阵为")
                printMat(tmp.trans())
            elif a == "7":
                print("计算两个矩阵相减 (两个矩阵的大小需要一相同)")
                row1,col1 = input("请输入矩阵1的行:"),input("请输入矩阵1的列:")
                mat1 = mkMat(int(row1),int(col1))
                row2,col2 = input("请输入矩阵2的行:"),input("请输入矩阵2的列:")
                mat2 = mkMat(int(row2),int(col2))
                tmp = MatCal(mat1,mat2)
                if tmp != None:
                    show2Res(mat1,mat2,tmp.sub())
            elif a == "8":
                print("计算两个矩阵对应相除 (两个矩阵shape应该一样)")
                row1,col1 = input("请输入矩阵1的行:"),input("请输入矩阵1的列:")
                mat1 = mkMat(int(row1),int(col1))
                row2,col2 = input("请输入矩阵2的行:"),input("请输入矩阵2的列:")
                mat2 = mkMat(int(row2),int(col2))
                tmp = MatCal(mat1,mat2)
                if tmp != None:
                    show2Res(mat1,mat2,tmp.divide())
            elif a == "9":
                print("计算两个矩阵对应相乘 (两个矩阵shape应该一样)")
                row1,col1 = input("请输入矩阵1的行:"),input("请输入矩阵1的列:")
                mat1 = mkMat(int(row1),int(col1))
                row2,col2 = input("请输入矩阵2的行:"),input("请输入矩阵2的列:")
                mat2 = mkMat(int(row2),int(col2))
                tmp = MatCal(mat1,mat2)
                if tmp != None:
                    show2Res(mat1,mat2,tmp.multi())
            elif a == "10":
                print("进行矩阵奇异值分解(请输入一个矩阵)")
                row1,col1 = input("请输入矩阵的行:"),input("请输入矩阵的列:")
                mat = mkMat(int(row1),int(col1))
                tmp = MatCom(mat)
                print("矩阵:")
                printMat(mat)
                t1,t2,t3 = tmp.svds()
                print("的左奇异值为:")
                print(t1)
                print("奇异值为:")
                print(t2)
                print("右奇异值为:")
                print(t3)
            elif a == "0":
                break
            else:
                print("输入错误")
            # 暂停一段时间
            time.sleep(2)            
    
  • 相关阅读:
    Qt中暂停线程的执行(主线程和工作线程共用一把锁,一旦主线程将它锁上,工作线程就无法运行了,这也是一个办法)
    罗振宇 知识就是力量:怎样逼自己成为一个上进的人
    GammaRay 是一个允许你查看 Qt 应用程序甚至在某种程度上修改它的独特应用,可谓是 Debugger 的良好补充
    VSCode高效开发插件
    微软白板Excel xls列号数字转字母
    如何渡过中年危机
    增量数据同步中间件
    N位N进制里有多少个N
    Orchard Core学习一
    Consul做服务发现
  • 原文地址:https://www.cnblogs.com/pprp/p/11005920.html
Copyright © 2011-2022 走看看