要求

制作一个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("\t{:.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 = "请输入想要的操作对应序号:\n 1. 矩阵相加 \n 2. 矩阵相乘 \n 3. 行列式计算 \n 4. 逆矩阵计算 \n 5. 特征分解 \n 6. 矩阵的转置\n "
str2 = "7. 矩阵相减 \n 8. 矩阵相除 \n 9. 矩阵对应相乘 \n 10. 奇异值分解 \n 0. 退出 \n 请输入:"
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)

基于numpy实现矩阵计算器的更多相关文章

  1. [转]Numpy中矩阵对象(matrix)

    numpy模块中的矩阵对象为numpy.matrix,包括矩阵数据的处理,矩阵的计算,以及基本的统计功能,转置,可逆性等等,包括对复数的处理,均在matrix对象中. class numpy.matr ...

  2. 一种基于 Numpy 的 TF-IDF 实现报告

    一种基于 Numpy 的 TF-IDF 实现报告 摘要 本文使用了一种 state-of-the-art 的矩阵表示方法来计算每个词在每篇文章上的 TF-IDF 权重(特征).本文还将介绍基于 TF- ...

  3. 科学计算三维可视化---Mlab基础(基于Numpy数组的绘图函数)

    Mlab了解 Mlab是Mayavi提供的面向脚本的api,他可以实现快速的三维可视化,Mayavi可以通过Mlab的绘图函数对Numpy数组建立可视化. 过程为: .建立数据源 .使用Filter( ...

  4. 深度学习基础-基于Numpy的卷积神经网络(CNN)实现

    本文是深度学习入门: 基于Python的实现.神经网络与深度学习(NNDL)以及动手学深度学习的读书笔记.本文将介绍基于Numpy的卷积神经网络(Convolutional Networks,CNN) ...

  5. numpy创建矩阵常用方法

    numpy创建矩阵常用方法 arange+reshape in: n = np.arange(0, 30, 2)# start at 0 count up by 2, stop before 30 n ...

  6. Python numpy中矩阵的用法总结

    关于Python Numpy库基础知识请参考博文:https://www.cnblogs.com/wj-1314/p/9722794.html Python矩阵的基本用法 mat()函数将目标数据的类 ...

  7. [开发技巧]·Python极简实现滑动平均滤波(基于Numpy.convolve)

    [开发技巧]·Python极简实现滑动平均滤波(基于Numpy.convolve) ​ 1.滑动平均概念 滑动平均滤波法(又称递推平均滤波法),时把连续取N个采样值看成一个队列 ,队列的长度固定为N ...

  8. 基于Numpy的神经网络+手写数字识别

    基于Numpy的神经网络+手写数字识别 本文代码来自Tariq Rashid所著<Python神经网络编程> 代码分为三个部分,框架如下所示: # neural network class ...

  9. 汉高澳大利亚matrix矩阵计算器

    我在梦中的超级计算机超级计算机锯,使用大量阵列的cpu记忆,完成并行计算.一个手机制造商由于使用普通机械提供的服务,往往造成停机.是铁道部列车网络售票的事实. 无法使用云服务.上万台计算机并行处理,因 ...

随机推荐

  1. Activiti之act_ge_property表引发的坑(dbSchemaUpdate)

    Activiti之act_ge_property表引发的坑(dbSchemaUpdate) 参考文档: https://blog.csdn.net/lb19921223/article/details ...

  2. jmeter的安装教程

    JMETER安装教程 jmeter的安装教程 1:安装jdk并且配置好环境变量,此处就不做赘述(前面的文档中有) 2:下载jmeter文件和jmeter的插件文件 JMeter:http://jmet ...

  3. 如何提高程序员的键盘使用效率(搬砖工人的自我修养(tucao))

    高软第一次作业 程序员使用键盘最常用的技能 搬运自:https://learnku.com/articles/22806    括号内为个人吐槽 1.尊重操作系统特性(如Mac OS的某些键位自定义设 ...

  4. 【GStreamer开发】GStreamer基础教程09——收集媒体信息

    目标 有时你需要快速的了解一个文件(或URI)包含的媒体格式或者看看是否支持这种格式.当然你可以创建一个pipeline,设置运行,观察总线上的消息,但GStreamer提供了一个工具可以帮你做这些. ...

  5. c# 无法加载DLL:找不到指定的模块(异常来自HRESULT:0X8007007E)

    c# 无法加载DLL“xxxx”:找不到指定的模块(异常来自HRESULT:0X8007007E)的一个解决方法 以前的一个c#项目,今天运行的时候突然发现调用DLL时出现了下面的错误. 心中很诧异, ...

  6. Django 之验证和授权

    一.验证和授权概述 Django有一个内置的授权系统.他用来处理用户.分组.权限以及基于cookie的会话系统.Django的授权系统包括验证和授权两个部分.验证是验证这个用户是否是他声称的人(比如用 ...

  7. 网页授权access_token,基础支持access_token,jsapi_ticket

    微信开发中网页授权access_token与基础支持的access_token异同 问题1:网页授权access_token与分享的jssdk中的access_token一样吗? 答:不一样.网页授权 ...

  8. twemproxy配置

    redis多主从,多节点,读写分离架构. nutcracker.yml的twemproxy配置 #redis_main是twemproxy所控制redis主从集群逻辑名称 redis_main: #t ...

  9. PAT(B) 1049 数列的片段和(C)规律

    题目链接:1049 数列的片段和 (20 point(s)) 题目描述 给定一个正数数列,我们可以从中截取任意的连续的几个数,称为片段.例如,给定数列 { 0.1, 0.2, 0.3, 0.4 },我 ...

  10. slot 组件的内部传值 v-slot 的使用

    嵌套组件传值 person.vue <template> <div class="vslot-test"> <ul> <li v-for= ...