矩阵乘法索引越界问题排查:方阵正常矩形矩阵异常
问题分析与解决方案
你的代码在处理矩形矩阵时出现索引越界错误,核心问题是矩阵乘法的循环索引逻辑完全混乱,方阵场景下只是碰巧没触发越界而已,咱们一步步拆解:
错误根源
报错信息 index 1 is out of bounds for axis 0 with size 1 来自这里:
当你用3×1的矩阵B时,c2=1,但你写了for i in range(c2+1)——也就是i会取0和1。而结果矩阵C是3×1的,列索引只能是0,当i=1时访问C[i][j],自然会触发列索引越界。
除此之外,你的三重循环变量顺序和对应关系完全不符合矩阵乘法的规则:
矩阵乘法中,A(r₁×c₁) × B(r₂×c₂) 的结果C(r₁×c₂),每个元素的计算规则是:C[i][k] = Σ(A[i][j] * B[j][k]),其中j从0到c₁-1(要求c₁=r₂)。
你的循环里k、i、j的对应关系完全搞反了,这才是本质问题。
修正后的代码
import numpy as np A = np.array([[12,7,3], [4 ,5,6], [7 ,8,9]]) B = np.array([[1],[1],[1]]) r1, c1 = A.shape r2, c2 = B.shape # 初始化结果矩阵,维度是r1×c2,用numpy的zeros更简洁 C = np.zeros((r1, c2), dtype=int) if c1 == r2: # 正确的三重循环逻辑:遍历C的行→遍历C的列→遍历累加维度 for i in range(r1): for k in range(c2): for j in range(c1): C[i][k] += A[i][j] * B[j][k] print("Matrix After Multiplication \n\n", C) else: print('Multiplication is not possible')
运行这段代码,你会得到正确的结果:
Matrix After Multiplication [[22] [15] [24]]
额外建议
其实numpy本身提供了非常高效的矩阵乘法实现,完全不需要手动写循环:
- 使用
np.dot(A, B) - 或者直接用
@运算符:A @ B
这两种方式不仅代码简洁,性能也远高于手动循环,尤其是处理大矩阵的时候。
内容的提问来源于stack exchange,提问作者Hafiz Muhammad Adeel Akbar
相关产品推荐
相关产品推荐

