当前位置: 首页 > news >正文

矩阵乘法--Python

矩阵乘法

  • 一、问题引入
  • 二、解题步骤
    • 1.思维导图
    • 2.解题步骤
  • 三、代码实现
  • 四、个人小结

一、问题引入

在这里插入图片描述
输入格式:
第一行为n, m, k,表示A矩阵是n行m列,B矩阵是m行k列,n, m, k均小于20
然后先后输入A和B两个矩阵,A矩阵n行m列,B矩阵m行k列,矩阵中每个元素的绝对值不会大于5000。

输出格式:
输出矩阵C,一共n行,每行k个整数,整数之间以一个空格分开。

输入样例:
在这里给出一组输入。例如:

3 2 3
1 1
1 1
1 1
1 1 1
1 1 1

输出样例:

2 2 2
2 2 2
2 2 2

二、解题步骤

1.思维导图

在这里插入图片描述

2.解题步骤

  1. 输入处理阶段
    ◦ 读取第一行获取矩阵维度:n(矩阵A行数), m(矩阵A列数/矩阵B行数), k(矩阵B列数)
    ◦ 读取接下来的n行,构建n×m的矩阵A
    ◦ 读取接下来的m行,构建m×k的矩阵B
  2. 矩阵乘法验证
    ◦ 检查矩阵A的列数(m)是否等于矩阵B的行数(len(B))
    ◦ 如果不匹配,输出错误信息并终止程序
  3. 矩阵乘法计算
    ◦ 初始化结果矩阵C为n×k的零矩阵
    ◦ 使用三重循环计算:
    ■ 外层循环遍历矩阵A的每一行(i)
    ■ 中层循环遍历矩阵B的每一列(j)
    ■ 内层循环计算A的第i行与B的第j列的点积(l)
    ◦ 计算公式:C[i][j] = Σ(A[i][l] * B[l][j]),其中l从0到m-1
  4. 结果输出
    ◦ 遍历结果矩阵C的每一行
    ◦ 将每行元素转换为字符串并用空格连接
    ◦ 逐行打印输出
  5. 边界条件处理
    ◦ 处理输入可能的多余空格或空行
    ◦ 确保矩阵元素绝对值不超过5000(题目给定条件)
    ◦ 维度n,m,k均小于20(题目给定条件)

三、代码实现

def main():import sysinput = sys.stdin.read().split()ptr = 0# 读取矩阵维度n = int(input[ptr])m = int(input[ptr+1])k = int(input[ptr+2])ptr += 3# 读取矩阵AA = []for _ in range(n):row = list(map(int, input[ptr:ptr+m]))A.append(row)ptr += m# 读取矩阵BB = []for _ in range(m):row = list(map(int, input[ptr:ptr+k]))B.append(row)ptr += k# 检查矩阵乘法是否可行if m != len(B):print(f"Error: {m} != {len(B)}")return# 计算矩阵乘积C = [[0]*k for _ in range(n)]for i in range(n):for j in range(k):C[i][j] = sum(A[i][l] * B[l][j] for l in range(m))# 输出结果for row in C:print(' '.join(map(str, row)))if __name__ == "__main__":main()

四、个人小结

通过本次矩阵乘法实验,我深入理解了矩阵运算的基本原理与Python实现方法。实验初期,我先通过数学理论复习了矩阵乘法的定义——只有当第一个矩阵的列数等于第二个矩阵的行数时,乘法才有意义,结果矩阵的行列数分别取两个矩阵的行数和列数。在代码实现环节,我掌握了用三重循环实现矩阵乘法的核心逻辑:外层循环遍历结果矩阵的行,中层循环遍历列,内层循环完成点积运算。这种嵌套循环结构让我直观理解了矩阵乘法"行乘列"的本质特性。

实验过程中,我特别注意到输入处理的重要性。通过使用sys.stdin.read()配合指针移动的方法,可以高效处理多行矩阵输入,这种技巧对后续处理其他结构化数据很有借鉴意义。在调试阶段,我添加了矩阵维度验证环节,这培养了我的防御性编程思维。最终的输出格式化处理也让我意识到,算法实现不仅要关注计算正确性,还需严格满足输出规范。

http://www.xdnf.cn/news/629749.html

相关文章:

  • Linux—进程池实现
  • 技术文档炼金术:从混乱到优雅的知识封装
  • 嵌入式工程师常用软件
  • React Native 拼音及拼音首字母搜索组件开发
  • 初识Vue【1】
  • 数据库调优与数据表的范式设计
  • C语言 动态内存管理(4)
  • SQL SERVER常用聚合函数整理及示例
  • 7.1查找的基本概念
  • 【samba和nfs的搭建】
  • MCP与AI模型的多语言支持:让人工智能更懂世界
  • 关于spring @Bean里调用其他产生bean的方法
  • Mybatis(2)
  • Oracle基础知识(四)
  • OpenLayers 加载测量控件
  • 网络安全零基础培训 JavaScript基础知识点
  • 传奇各种怪物一览/图像/爆率/产出/刷新地/刷新时间/刷怪时间
  • Compose 中的 LaunchedEffect
  • 深入了解linux系统—— 操作系统的路径缓冲与链接机制
  • 真实案例拆解:智能AI客服系统中的两类缓存协同
  • 由浮点数的位级表示判断大小关系
  • 人工智能100问☞第31问:如何评估一个AI模型的性能?
  • 【MySQL】索引
  • 【动态规划】P12223 [蓝桥杯 2023 国 Java B] 非对称二叉树|普及+
  • python打卡day35@浙大疏锦行
  • 【笔记】OpenCV的学习(未完)
  • CodeBuddy 实现图片转素描手绘工具
  • springboot中各模块间实现bean之间互相调用(service以及自定义的bean)
  • 符合Python风格的对象(使用 __slots__ 类属性节省空间)
  • 搜索二叉树