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列。你的代码存在两个核心问题:
- 外层循环遍历的是
matT的行数(2次),但乘积矩阵的行数应该等于原矩阵mat的行数(3次),导致逻辑错位。 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
相关产品推荐
相关产品推荐

