You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何无需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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:11:39