无需Numpy实现通用矩阵乘法:如何扩展特定维度矩阵乘法代码
实现通用矩阵乘法的方案
你的现有代码是硬编码了1×3和3×2矩阵的乘法逻辑,要改成通用版本,得严格按照矩阵乘法的数学规则来实现,具体步骤如下:
1. 先做合法性校验
矩阵乘法的核心前提是第一个矩阵的列数必须等于第二个矩阵的行数,不满足这个条件的话直接抛出错误提示。
2. 获取矩阵维度
- 设矩阵A是
m×n(m行n列),矩阵B是n×p(n行p列),最终结果矩阵就是m×p维度; - 通过
len(matA)获取A的行数m,len(matA[0])获取A的列数n;同理len(matB)是B的行数,len(matB[0])是B的列数p。
3. 初始化结果矩阵
创建一个m行p列的零矩阵,用来存储每一步的计算结果。
4. 三重循环计算每个元素
结果矩阵中第i行第j列的元素,等于A的第i行和B的第j列对应位置元素相乘后求和,数学公式为:result[i][j] = sum(A[i][k] * B[k][j] for k in range(n))
修改后的完整代码
def matmul(matA, matB): # 获取矩阵维度 m = len(matA) n = len(matA[0]) if m > 0 else 0 p = len(matB[0]) if len(matB) > 0 else 0 # 合法性校验:A的列数必须等于B的行数 if n != len(matB): raise ValueError("矩阵A的列数必须等于矩阵B的行数,无法进行乘法运算") # 初始化m行p列的结果矩阵 result = [[0 for _ in range(p)] for _ in range(m)] # 三重循环计算每个元素 for i in range(m): for j in range(p): for k in range(n): result[i][j] += matA[i][k] * matB[k][j] # 返回结果而非直接打印,提升代码灵活性 return result # 测试原有1×3 乘 3×2的用例 A = [ [5], [-5], [10] ] B = [ [-10, 13], [57, -37], [-96, 15] ] print(matmul(A, B)) # 输出: [[-1295, 370]] # 测试2×3 乘 3×2的通用用例 C = [ [1, 2, 3], [4, 5, 6] ] D = [ [7, 8], [9, 10], [11, 12] ] print(matmul(C, D)) # 输出: [[58, 64], [139, 154]]
额外说明
- 把你原来的元组格式改成了列表,这是Python中矩阵的常见写法,代码也兼容元组输入;
- 原有代码直接打印结果,修改后改为返回结果,让调用方可以自主决定后续处理方式;
- 增加了空矩阵的边界处理,避免索引错误;
- 三重循环是最直观的手动实现方式,如果要处理超大矩阵追求性能,可直接使用numpy库的
np.matmul,但手动实现的逻辑完全通用。
内容的提问来源于stack exchange,提问作者Landen Ty
相关产品推荐
相关产品推荐

