矩阵乘法--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.解题步骤
- 输入处理阶段
◦ 读取第一行获取矩阵维度:n(矩阵A行数), m(矩阵A列数/矩阵B行数), k(矩阵B列数)
◦ 读取接下来的n行,构建n×m的矩阵A
◦ 读取接下来的m行,构建m×k的矩阵B - 矩阵乘法验证
◦ 检查矩阵A的列数(m)是否等于矩阵B的行数(len(B))
◦ 如果不匹配,输出错误信息并终止程序 - 矩阵乘法计算
◦ 初始化结果矩阵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 - 结果输出
◦ 遍历结果矩阵C的每一行
◦ 将每行元素转换为字符串并用空格连接
◦ 逐行打印输出 - 边界条件处理
◦ 处理输入可能的多余空格或空行
◦ 确保矩阵元素绝对值不超过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()配合指针移动的方法,可以高效处理多行矩阵输入,这种技巧对后续处理其他结构化数据很有借鉴意义。在调试阶段,我添加了矩阵维度验证环节,这培养了我的防御性编程思维。最终的输出格式化处理也让我意识到,算法实现不仅要关注计算正确性,还需严格满足输出规范。