我正在参加MATLAB课程,并编写了以下代码。一个是FOR LOOP,另一个是矢量化。 FOR LOOP返回正确的结果,但矢量化没有。任何人都可以告诉我我的编码错误吗?
应该是以下等式。
1 - 1/3 + 1/5 - 1/7 + 1/9 - ...... - 1/1003(总和为0.7849 - 收敛 慢慢地到pi / 4)
使用循环
clc
clear
tic
sign = -1;
y=0;
for x=1:2:1003
sign=-sign;
y=y+sign/x;
end
disp(['For Loop calculated ' num2str(y), ' and ran for ' num2str(toc)])
使用矢量化
clear
tic
n=1:2:1003;
x=sum(1./n -1./(n+2));
disp(['Vectorization calculated ' num2str(x), ' and ran for ' num2str(toc)])
答案 0 :(得分:2)
在矢量化代码中,将x
行替换为:
x = sum(1./n .* (-1).^(0:numel(n)-1))
1./n
之后的术语负责交替符号。
现在,你的代码sum(1./n -1./(n+2))
给你1 + 1/3 + 1/5 + ... + 1/1003 - (1/3 + 1/5 + ... + 1 / 1005),即(取消条款后),1-1 / 1005。
答案 1 :(得分:2)
您可以更改总结中使用的公式(as suggested by Luis),也可以保留公式,只需将n
向量中的步长更改为:
n = 1:4:1003;