Matlab嵌套循环转Python:列表元素修改问题求助
问题解决:MATLAB求和代码转Python的错误修正
原MATLAB代码逻辑
这段来自《Programming and Numerical Methods in MATLAB》(Otto&Denier著,第75页)的代码功能是:输入一个幂次p,计算从N=1到N=p+2的每个N对应的累加和1^p + 2^p + ... + N^p,并将结果存入数组sums。当p=3时,points=5,对应计算N=1到5的立方和,输出为[1, 9, 36, 100, 225]。
原MATLAB代码:
clear all p = input('Enter the power you require: '); points = p+2; n = 1:points; for N = n sums(N) = 0; for j = 1:N sums(N) = sums(N)+j^p; end end
你的Python代码问题分析
第一个版本的错误:
- 每次循环
N时,都重新创建长度为N的sums列表,导致之前的计算结果被覆盖,最终只会保留最后一次循环的sums - 使用
enumerate时,index从0开始,计算index**p相当于从0的幂次累加,和原逻辑中从1开始累加完全不符
- 每次循环
第二个版本的错误:
- 没有提前初始化足够长度的
sums列表,Python列表是0-based索引,而MATLAB是1-based,直接访问sums[N]会超出列表的索引范围(比如当N=1时,列表最大索引是0)
- 没有提前初始化足够长度的
正确的Python实现
贴合原MATLAB逻辑的Python代码如下:
p = int(input('Enter the power you require: ')) points = p + 2 # 初始化sums为长度等于points的列表,对应N从1到points的结果,初始值为0 sums = [0] * points # 外层循环遍历N从1到points(对应MATLAB的n=1:points) for N in range(1, points + 1): # 内层循环累加j^p,j从1到N for j in range(1, N + 1): # Python索引是0-based,所以N对应的位置是N-1 sums[N - 1] += j ** p print(sums)
当输入p=3时,输出结果为:
[1, 9, 36, 100, 225]
如果想更简洁,也可以用Python内置的sum函数替换内层循环,效果一致:
p = int(input('Enter the power you require: ')) points = p + 2 sums = [0] * points for N in range(1, points + 1): sums[N - 1] = sum(j ** p for j in range(1, N + 1)) print(sums)
内容的提问来源于stack exchange,提问作者Dimitris
相关产品推荐
相关产品推荐

