当前位置: 首页 > 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()配合指针移动的方法,可以高效处理多行矩阵输入,这种技巧对后续处理其他结构化数据很有借鉴意义。在调试阶段,我添加了矩阵维度验证环节,这培养了我的防御性编程思维。最终的输出格式化处理也让我意识到,算法实现不仅要关注计算正确性,还需严格满足输出规范。

相关文章:

  • ES的Refresh、Flush、Merge操作对性能的影响? ES如何实现近实时(NRT)搜索? ES聚合查询的Terms和Cardinality区别?
  • Linux的读写屏障
  • Matlab实战训练项目推荐
  • 每日c/c++题 备战蓝桥杯(洛谷P1873 EKO砍树问题详解)
  • 打卡day35
  • 嵌入式开发之STM32学习笔记day10
  • DNS Server在高可用高并发系统中的应用
  • 探秘Transformer系列之(34)--- 量化基础
  • 【VBA中的集合(Collection)的引用和方法参数】 VS 字典(Dictionary)
  • 【无标题】python执行系统命令
  • Python 训练营打卡 Day 34
  • 基于Springboot + vue3实现的养老系统
  • 电子电路:再谈滤波原理及其应用
  • 卷积神经网络优化与应用实践:参数设置、泛化能力提升及多领域应用解析
  • LeetCode 3362.零数组变换 III:贪心+优先队列+差分数组——清晰题解
  • 6个月Python学习计划 Day 3
  • 【第四篇】 SpringBoot整合第三方技术
  • 【Linux 学习计划】-- git 在Linux远端服务器上的部署与简单使用
  • Ubuntu24安装Ollama
  • Java三十而立:Java 的30岁与Spring AI 1.0正式发布
  • 制作公司网站 黑龙江/常德seo公司
  • 网站开发报价表 excel/培训加盟
  • 视频变成网站怎么做/百度招商加盟推广
  • 电影网站源码怎么做的/八八网
  • 怎么做网站效果图/深圳外贸seo
  • 苏州做网站专业的公司/cilimao磁力猫搜索引擎