zoukankan      html  css  js  c++  java
  • 百道Python入门级练习题(新手友好)第一回合——矩阵乘法

    题目描述

    【问题描述】
    编写程序,完成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 都在这里了

  • 相关阅读:
    求最小公倍数,最大公约数
    C> gcc函数属性__nothrow__, __leaf__
    Linux进程通信
    Linux 系统编程学习笔记
    Linux 系统编程学习笔记
    Linux 系统编程学习笔记
    Linux 系统编程学习笔记
    Linux 系统编程学习笔记
    Linux 系统编程学习笔记
    Linux> gcc编译选项
  • 原文地址:https://www.cnblogs.com/hahaa/p/9819472.html
Copyright © 2011-2022 走看看