如何无需Numpy实现嵌套列表递归迭代与矩阵乘法?
不依赖Numpy实现分治矩阵乘法
当然可以完全脱离Numpy实现递归分治的矩阵乘法,我们可以用原生Python的列表(list of lists)来模拟矩阵,自己实现切片、矩阵加法、子矩阵合并这些操作。下面一步步来拆解实现过程:
1. 先实现基础辅助函数
首先需要几个基础工具函数来支撑分治逻辑:
创建零矩阵
用来生成指定大小的全零矩阵:
def create_zero_matrix(n): return [[0 for _ in range(n)] for _ in range(n)]
矩阵加法
实现两个同大小矩阵的逐元素相加:
def matrix_add(a, b): n = len(a) result = create_zero_matrix(n) for i in range(n): for j in range(n): result[i][j] = a[i][j] + b[i][j] return result
2. 实现递归分治的矩阵乘法
接下来我们把Numpy版本的逻辑转换成原生Python列表操作:
- 替换Numpy的切片操作:用列表推导式提取子矩阵
- 递归终止条件和Numpy版本一致:当矩阵大小为1时直接返回元素乘积
- 最后将计算得到的子矩阵合并到结果矩阵的对应位置
完整代码如下:
def matrix_multiplication(A, B): n = len(A) # 递归终止条件:1x1矩阵 if n == 1: return [[A[0][0] * B[0][0]]] i = n // 2 # 分割子矩阵 # 分割A的四个子矩阵 A11 = [row[:i] for row in A[:i]] A12 = [row[i:] for row in A[:i]] A21 = [row[:i] for row in A[i:]] A22 = [row[i:] for row in A[i:]] # 分割B的四个子矩阵 B11 = [row[:i] for row in B[:i]] B12 = [row[i:] for row in B[:i]] B21 = [row[:i] for row in B[i:]] B22 = [row[i:] for row in B[i:]] # 递归计算子矩阵乘法 C11 = matrix_add(matrix_multiplication(A11, B11), matrix_multiplication(A12, B21)) C12 = matrix_add(matrix_multiplication(A11, B12), matrix_multiplication(A12, B22)) C21 = matrix_add(matrix_multiplication(A21, B11), matrix_multiplication(A22, B21)) C22 = matrix_add(matrix_multiplication(A21, B12), matrix_multiplication(A22, B22)) # 合并结果矩阵 result = create_zero_matrix(n) # 填充C11 for x in range(i): for y in range(i): result[x][y] = C11[x][y] # 填充C12 for x in range(i): for y in range(i): result[x][i + y] = C12[x][y] # 填充C21 for x in range(i): for y in range(i): result[i + x][y] = C21[x][y] # 填充C22 for x in range(i): for y in range(i): result[i + x][i + y] = C22[x][y] return result # 测试示例 x = [[1, 2], [3, 4]] y = [[1, 2], [3, 4]] print(matrix_multiplication(x, y))
3. 测试输出
运行上面的代码,会得到和Numpy版本完全一致的结果:
[[7, 10], [15, 22]]
关于你提到的切片思路
你写的c_one = [C[i][0:int(len(C) / 2)] for i in range(0,int(len(C) / 2))]其实就是提取矩阵C的左上角子矩阵的思路,和我们代码里A11 = [row[:i] for row in A[:i]]的逻辑完全一致,这个思路非常正确,只需要把它扩展到四个子矩阵的提取,再配合递归和合并逻辑就可以完成整个功能啦。
内容的提问来源于stack exchange,提问作者Lucas
相关产品推荐
相关产品推荐

