Matlab不接受整数作为索引

时间:2014-03-24 21:23:50

标签: matlab indexing precision

我正在使用一个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。 我想我可以使用“圆形”来解决这个问题,但是之前有效并且突然不起作用,我想找出原因。 谢谢!

3 个答案:

答案 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,如上所述。 我估计这会改善比较。