使用嵌套for循环实现行变体标量版矩阵向量乘法函数matvec_row_variant_scalar
matvec_row_variant_scalar 函数问题排查与实现
现有代码存在的问题
- 内层循环边界错误:内层j的遍历范围错误使用了A的行数
A.shape[0],矩阵-向量乘法要求A的列数等于x的长度,应该遍历A的列数A.shape[1],非方阵场景下会直接触发索引越界。 - 非法修改输入矩阵:循环内直接对
A[i,j]赋值,会修改外部传入的原始矩阵,产生不必要的副作用,且该操作完全冗余。 - 结果赋值逻辑错误:矩阵-向量乘法的结果
y[i]是A的第i行与x的点积,现有代码在j循环中错误修改y[j],还调用了A[i,:].sum()数组方法,不符合「仅使用标量访问」的要求,逻辑完全不匹配计算规则。 - 输入维度兼容问题:传入的测试x是二维列向量(shape为(n,1)),直接索引
x[j]会得到一维数组而非标量,且函数没有兼容处理一维输入的逻辑。 - 测试用例语法错误:测试矩阵A中写了
[0,,0],多了多余逗号,不符合numpy数组语法规则。 - 多余的强制类型转换:代码中
int(x[j])会强制将x的元素转为整型,丢失浮点型输入的精度,无存在必要。
修正后符合要求的代码
import numpy as np def matvec_row_variant_scalar(A, x): # 初始化结果向量,长度等于A的行数 y = np.zeros(A.shape[0]) # 外层循环遍历A的每一行 for i in range(A.shape[0]): # 内层循环遍历A的每一列,通过标量运算计算点积 for j in range(A.shape[1]): # 直接累加标量乘积到y[i],不修改原矩阵 y[i] += A[i][j] * x[j] return y # 修正后的测试用例 A = np.array([[1,0,0],[0,1,0],[0,0,1]]) x = np.array([1, 2, 3]) print(matvec_row_variant_scalar(A,x))
代码说明
- 严格使用两层嵌套循环,所有运算都通过
A[i][j]和x[j]的标量访问完成,没有调用任何数组级别的运算方法,完全符合要求。 - 不会修改输入的A和x,无额外副作用。
- 兼容非方阵的输入场景,只要A的列数等于x的长度即可正常计算。
- 测试用例输出结果为
[1. 2. 3.],和单位矩阵乘向量的预期结果一致。
内容的提问来源于stack exchange,提问作者Chirag Purohit
相关产品推荐
相关产品推荐

