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

Python无Numpy实现矩阵自乘转置函数报错排查求助

矩阵与转置相乘函数的索引错误排查

需求说明

实现函数mat_mult_by_transpose(mat),接收非空有效矩阵mat,返回mat与其转置(mat)ᵀ的乘积矩阵,需返回新矩阵且不修改原矩阵。

示例1

mat = [[1,2],[3,4],[5,6]] 
mult_mat = mat_mult_by_transpose(mat) 
print(mat) # [[1, 2], [3, 4], [5, 6]] 
print(mult_mat) # [[5, 11, 17], [11, 25, 39], [17, 39, 61]]

示例2

mat2 = [[0, 1, 2], [10, 11, 12], [20, 21, 22]] 
mult_mat2 = mat_mult_by_transpose(mat2) 
print(mult_mat2) # [[5, 35, 65], [35, 365, 695], [65, 695, 1325]]

尝试代码

def mat_transpose(mat):
    transposedMat= []
    i = 0
    for i in range(len(mat[i])):
        newMat= []
        for j in range(len(mat)):
                newMat.append(mat[j][i])
        transposedMat.append(newMat)
    return transposedMat

def mat_mult_by_transpose(mat):
    matT = mat_transpose(mat)
    mat2 = []
    for i in range(len(matT)):
        temp_list=[]
        for j in range(len(matT)):
            sum = 0
            for k in range(len(matT[0])):
                sum += mat[i][k] * matT[k][j]
            temp_list.append(sum)
        mat2.append(temp_list)
    return mat2

遇到的错误

Traceback (most recent call last):
  File "file0.py", line 156, in <module>
    mult_mat = mat_mult_by_transpose(mat)
  File "file0.py", line 97, in mat_mult_by_transpose
    sum += mat[i][k] * matT[k][j]
IndexError: list index out of range

错误原因及修复

问题根源

以示例1为例,原矩阵mat是3行2列,转置后的matT是2行3列。你的代码存在两个核心问题:

  1. 外层循环遍历的是matT的行数(2次),但乘积矩阵的行数应该等于原矩阵mat的行数(3次),导致逻辑错位。
  2. k的循环范围取了matT[0]的长度(3),但原矩阵每行只有2个元素,当k=2时,mat[i][k]会触发索引越界。

修复后的代码

def mat_transpose(mat):
    transposedMat = []
    # 遍历原矩阵的列数
    for i in range(len(mat[0])):
        newMat = []
        # 遍历原矩阵的行数
        for j in range(len(mat)):
            newMat.append(mat[j][i])
        transposedMat.append(newMat)
    return transposedMat

def mat_mult_by_transpose(mat):
    matT = mat_transpose(mat)
    mat2 = []
    # 乘积矩阵行数 = 原矩阵行数
    for i in range(len(mat)):
        temp_list = []
        # 乘积矩阵列数 = 转置矩阵列数 = 原矩阵行数
        for j in range(len(matT[0])):
            sum_val = 0
            # 相乘元素个数 = 原矩阵列数 = 转置矩阵行数
            for k in range(len(mat[0])):
                sum_val += mat[i][k] * matT[k][j]
            temp_list.append(sum_val)
        mat2.append(temp_list)
    return mat2

关键调整点

  • 外层循环改为遍历原矩阵的行数,确保生成正确行数的乘积矩阵。
  • k的循环范围改为原矩阵的列数,避免索引越界。
  • 将变量名sum改为sum_val,避免与内置函数sum冲突。

内容的提问来源于stack exchange,提问作者Libi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 21:35:37