题目描述

【问题描述】
编写程序,完成3*4矩阵和4*3整数矩阵的乘法,输出结果矩阵。

【输入形式】
一行,供24个整数。以先行后列顺序输入第一个矩阵,而后输入第二个矩阵。

【输出形式】
先行后列顺序输出结果矩阵,每个元素的显示宽度为8格,屏幕一行只显示矩阵的一行。

【样例输入】

1 2 3 4 5 6 7 8 9 1 2 3 9 8 7 6 5 4 3 2 1 1 2 3

上面的输入,意味着要计算如下两个矩阵的乘积。

第一个矩阵 :

1 2 3 4

5 6 7 8

9 1 2 3

第二个矩阵:
9 8 7

6 5 4

3 2 1

1 2 3
【样例输出】
左侧的1,2,3不是程序输出的内容。

34 32 30
110 100 90
96 87 78
123

知识点

输入一组整数
矩阵的输入
矩阵乘法
矩阵的输出
输出的值占8格

步骤1:输入一组整数

line = input().split()
nums = []
for s in line:
nums.append(int(s))
print(nums)12345

对以上代码,说明如下:
1. 第1行,input()读入整行,split()以空格为分隔符把整行分割成多段,生成数字字符串列表line。
2. 第2行,nums变量用来存储整数列表,初始化为空列表。
3. 第3,4行,for循环的作用是遍历数字字符串列表line内的每个元素s,把这个元素s转换为整数后,加到nums列表尾部。
4. 第5行,打印nums列表的值,可以帮助检查是否输入成功。

步骤2:生成两个相乘的矩阵

步骤2是把步骤1接收到的整数分装到两个矩阵内。

#1.1 第1个矩阵
mtx1 = []
for r in range(3):
row = []
for c in range(4):
row.append(nums[r * 4 + c])
mtx1.append(row)
print(mtx1)

#第二个矩阵
mtx2 = []
start = 3 * 4 #起点下标
for r in range(4):
row = []
for c in range(3):
row.append(nums[start + r * 3 + c])
mtx2.append(row)
print(mtx2)123456789101112131415161718

对于以上代码,解释如下:
1. 第2行,mtx1用来记住第一个矩阵。它是3行4列的矩阵。它的初值是空列表。
2. 第3行到第7行,是一个for循环。每循环一次,得到矩阵的一行。row变量用来记住这一行。
3. 第4行,row变量初始化为空列表。
4. 第5,6行,是一个for循环。每循环一次,就往row列表中加入一个整数。循环4次,就生成了一行。
5. 第7行,把矩阵的一行加到mtx1的尾部。mtx1是以列表作为元素的列表,也即矩阵。
6. 第9行开始,生成第二个矩阵mtx2。生成第二个矩阵的做法与生成第一个矩阵的做法是类似的。不同点有两处。第一处是,矩阵的元素来自nums列表中start位置及其后的元素。第二处不同是,第二个矩阵是4行3列的。
7. print(mtx1)和print(mtx2)这两条语句用于打印两个矩阵的值,帮助检查是否正确生成了两个矩阵。不过,矩阵的元素在屏幕上没有分行显示,而是显示在同一行。

步骤3:矩阵相乘

3行4列的矩阵乘以4行3列的矩阵,结果是3行3列的矩阵。你事先要熟悉矩阵的乘法。
以下代码的思路是,依次求出3行3列矩阵的每一个元素的值。

#矩阵乘法
result = []
for r in range(3):
row = []
for c in range(3):
v = mtx1[r][0] * mtx2[0][c] + mtx1[r][1] * mtx2[1][c] + mtx1[r][2] * mtx2[2][c] + mtx1[r][3] * mtx2[3][c]
row.append(v)
result.append(row)12345678

对于以上代码,说明如下:
1. result用来存储3行3列的矩阵。
2. 第2行到第7行构成一条for循环语句。一共循环3次。每循环一次,求出result矩阵的一行。
3. 第3行,row变量用来存储矩阵的一行。初值设为空列表。
4. 第4行到第6行构成一条for循环语句。这是内循环。一共循环3次。每循环一次,求出第r行(r从0开始编号)中的一个元素的值。v变量记住这个值。第6行把v变量加到row列表尾部。
5. 第7行,row加到result矩阵尾部,成为新的一行。

步骤4:输出矩阵

输出矩阵要满足两个要求:
1. 分成3行。
2. 每一行的每个元素占8格。
代码是:

for r in range(3):
print(str(result[r][0]).rjust(8) + str(result[r][1]).rjust(8) + str(result[r][2]).rjust(8))12

对以上代码说明如下:
1. for循环一共执行3次。每一次,输出矩阵的一行。
2. str(result[r][0]).rjust(8)的作用是,首先把元素result[r][0]转换为字符串形式的值,然后调用字符串的rjust方法,使得字符串长度不足8格的话,左侧填充空格。假设,result[r][0]值是34,那么输出的时候,左侧将填充6个空格,形成有8个字符的字符串,即“======34”。这里,=代表的是空格。

完整的代码

#矩阵乘法

#1. 输入
line = input().split()
nums = []
for s in line:
nums.append(int(s))
print(nums)

#1.1 第1个矩阵
mtx1 = []
for r in range(3):
row = []
for c in range(4):
row.append(nums[r * 4 + c])
mtx1.append(row)
print(mtx1)

#第二个矩阵
mtx2 = []
start = 3 * 4 #起点下标
for r in range(4):
row = []
for c in range(3):
row.append(nums[start + r * 3 + c])
mtx2.append(row)
print(mtx2)

#矩阵乘法
result = []
for r in range(3):
row = []
for c in range(3):
v = mtx1[r][0] * mtx2[0][c] + mtx1[r][1] * mtx2[1][c] + mtx1[r][2] * mtx2[2][c] + mtx1[r][3] * mtx2[3][c]
row.append(v)
result.append(row)

#输出结果矩阵
for r in range(3):
print(str(result[r][0]).rjust(8) + str(result[r][1]).rjust(8) + str(result[r][2]).rjust(8))12345678910111213141516171819202122232425262728293031323334353637383940

小结

分步骤解题,每步达成一个小目标。
每一步的末尾,打印输出中间结果,有利于验证代码是否正确。
不熟悉的话,多读几遍,自己默写几遍,就会成为你的代码。Python学习资料或者需要代码、视频加这个群吧548加上377还有875 都在这里了

百道Python入门级练习题(新手友好)第一回合——矩阵乘法的更多相关文章

  1. 百道Python面试题实现,搞定Python编程就靠它

    对于一般的机器学习求职者而言,最基础的就是掌握 Python 编程技巧,随后才是相关算法或知识点的掌握.在这篇文章中,我们将介绍一个 Python 练习题项目,它从算法练习题到机试实战题提供了众多问题 ...

  2. 【转】POJ百道水题列表

    以下是poj百道水题,新手可以考虑从这里刷起 搜索1002 Fire Net1004 Anagrams by Stack1005 Jugs1008 Gnome Tetravex1091 Knight ...

  3. 数百道BAT等大厂最新Python面试真题,学到你手软!

    春招临近,无论是要找工作的准毕业生,还是身在职场想要提升自己的程序员,提升自己的算法内功心法.提升 Python 编程能力,总是大有裨益的.今天,小编发现了一份好资源:Python 实现的面试题集锦! ...

  4. 面试前赶紧看了5道Python Web面试题,Python面试题No17

    目录 本面试题题库,由公号:非本科程序员 整理发布 第1题: Flask中的请求上下文和应用上下文是什么? 第2题:django中间件的使用? 第3题: django开发中数据做过什么优化? 第4题: ...

  5. 这 100 道 Python 题,拿去刷!!!

    2020年,学 Python 还有价值吗? 根据 2020 年 2 月的 TIOBE 编程语言排行榜显示,Python仍然稳居第三位. 此排行榜排名基于互联网上有经验的程序员. 课程和第三方厂商的数量 ...

  6. 千万不要错过这几道Python面试题,Python面试题No16

    第1题: python下多线程的限制以及多进程中传递参数的方式? python多线程有个全局解释器锁(global interpreter lock),简称GIL,这个GIL并不是python的特性, ...

  7. Python 小白的新手教程(一)

    本文是 python 入门级别的基础知识,包括数据类型和变量.输入输出.字符串和编码.list tuple dict set .条件判断.循环.函数.切片 迭代 列表生成器 生成器 迭代器等. 参考课 ...

  8. python入门练习题1

    常见python入门练习题 1.执行python脚本的两种方法 第一种:给python脚本一个可执行的权限,进入到当前存放python程序的目录,给一个x可执行权限,如:有一个homework.py文 ...

  9. C++ 的语言杂谈(一)--C++不是新手友好的

    C++的语言品味是独特的,喜欢的人特别喜欢,讨厌的人特别讨厌.虽然Bjane Stroustrup不断地宣称C++的发展方向是新手友好的,但实际上对新手来说,最重要的还是有强大方便的标准库可以使用(像 ...

随机推荐

  1. 是否含有RTTI(运行时类型信息)是动态语言与静态语言的主要区别

    运行时类型信息代表类型信息和对内存的操作能力. 运行时类型信息是运行时系统的基础. 类型信息分为编译时类型信息和运行时类型信息两种: 静态语言的类型信息只在编译时使用和保留,在可执行文件中没有类型信息 ...

  2. centos7 tengine 安装

    Tengine是由淘宝网发起的Web服务器项目.它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性.Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了很好的检 ...

  3. 理解JavaScript继承(二)

    理解JavaScript继承(二) 5.寄生式继承 function object(o) { function F() {} F.prototype = o; return new F(); } fu ...

  4. Sublime Text 自动生成文件头部注释(版权信息):FileHeader 插件的使用

    (一)安装步骤 1.先安装一个 Package Control 插件.相信大家使用 Sublime 的话都有安装这个了2.Preference -> Package Control -> ...

  5. Spring源码分析(二十四)初始化非延迟加载单例

    摘要: 本文结合<Spring源码深度解析>来分析Spring 5.0.6版本的源代码.若有描述错误之处,欢迎指正. 完成BeanFactory的初始化工作,其中包括ConversionS ...

  6. Spring源码分析(十六)准备创建bean

    本文结合<Spring源码深度解析>来分析Spring 5.0.6版本的源代码.若有描述错误之处,欢迎指正. 我们不可能指望在一个函数中完成一个复杂的逻辑,而且我们跟踪了这么多Spring ...

  7. mysql命令框中向表中插入中文字符,在可视化工具MySQL Workbeach或phpMyAdmin中不显示或显示乱码的问题解决

     一.问题导出 在刚刚开始学习MySQL数据库应用与开发这门课程的时候,老师建议我们使用可视化工具MySQL Workbeach进行数据库的相关管理,但是小编在mysql命令框使用insert命令向表 ...

  8. 一、Django的简介

    2019-04-09 22:58:22 大家好,我是一名普普通通的运维工程师,不甘平庸,想在工作之余多学习一些编程技能,不仅提升自我,还能应用于公司的运维自动化工作(代码的自动发布等).希望今后在这记 ...

  9. 远端访问MySQL

    磨砺技术珠矶,践行数据之道,追求卓越价值 回到上一级页面: PostgreSQL杂记页     回到顶级页面:PostgreSQL索引页 [作者 高健@博客园  luckyjackgao@gmail. ...

  10. 2-7 hash

    1.Hash Hash函数处理流程Hash,一般翻译做"散列",也有直接音译为"哈希"的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算 ...