我正在使用一个while循环,索引t从1开始,并随着每个循环而增加。 我在循环中的以下代码中遇到了这个索引的问题:
dt = 100000^(-1);
t = 1;
equi = false;
while equi==false
***some code that populates the arrays S(t) and I(t)***
t=t+1;
if (t>2/dt)
n = [S(t) I(t)];
np = [S(t-1/dt) I(t-1/dt)];
if sum((n-np).^2)<1e-5
equi=true;
end
end
首先,“{”}语句中的代码是在t==200000
而不是t==200001
处访问的。
其次,表达式S(t-1/dt)
会产生错误消息"Subscript indices must either be real positive integers or logicals"
,即使(t-1/dt)
为完整且等于1.0000e+005
。
我想我可以使用“圆形”来解决这个问题,但是之前有效并且突然不起作用,我想找出原因。
谢谢!
答案 0 :(得分:3)
表达式S(t-1 / dt)导致错误消息&#34;下标索引必须是实数正整数或逻辑&#34;,即使(t-1 / dt)是整数且等于1.0000 E + 005
真的吗? ;)
mod(200000 - 1/dt, 1)
%ans = 1.455191522836685e-11
您的索引不是整数。这是使用浮点运算时需要注意的事项之一。我建议阅读这个优秀的资源:"What every computer scientist should know about floating-point Arithmetic"。
您可以像这样使用round
,也可以将1/dt
存储为单独的变量(存在许多选项)。
答案 1 :(得分:0)
Matlab骗你。你遇到浮点不准确,Matlab没有诚实的打印政策。尝试以完全精确的方式打印数字:
dt = 100000^(-1);
t = 200000;
fprintf('2/dt == %.12f\n',2/dt) % 199999.999999999971
fprintf('t - 1/dt == %.12f\n',t - 1/dt) % 100000.000000000015
虽然10的幂对我们打字和阅读非常好,但1e-5
(你的dt
)不能完全表示为浮点数。这就是为什么你得到的计算结果不是整数。
答案 2 :(得分:0)
声明
S(t-1/dt)
可以替换为
S(uint32(t-1/dt))
同样适合我。 此外,您可能希望将1 / dt硬编码保存为100000,如上所述。 我估计这会改善比较。