逻辑索引和双精度数

时间:2014-06-10 00:02:21

标签: matlab data-structures double logical-operators

我正在尝试使用Newton-Raphson迭代方法求解非线性方程组,并且为了探索我的变量的参数空间,存储先前的解决方案并将它们用作我的第一个初始值是有用的猜测,以便我留在吸引力的盆地。

我目前将我的解决方案保存在一个结构数组中,我以这种方式存储在.mat文件中:

load('solutions.mat','sol');
str = struct('a',Param1,'b',Param2,'solution',SolutionVector);
sol=[sol;str];
save('solutions.mat','sol');

现在,我再做一次运行,其中我需要针对不同参数NewParam1和NewParam2的上述解决方案。如果Param1 = NewParam1-deltaParam1,Param2 = NewParam2-deltaParam2,那么

load('solutions.mat','sol');
index = [sol.a]== NewParam1 - deltaParam1 & [sol.b]== NewParam2 - deltaParam2; 
% logical index to find solution from first block
SolutionVector = sol(index).solution;

我有时会收到一条错误消息,指出不存在此类解决方案。问题在于我的参数的双精度,因为在Matlab中可能发生2-1~ = 1,但我似乎无法找到另一种方法来实现相同的结果。我已经尝试在保存过程中将数值参数更改为字符串,但后来我遇到了使用字符串进行逻辑索引的问题。

理想情况下,我希望避免将我的参数乘以10的幂来使它们成为整数,因为这会使代码因参数的数量而变得非常混乱。除此之外,任何帮助将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:1)

在比较MATLAB中的双精度数时,不应该使用==。原因是,正如你在问题中所说的那样,有些数字不能用二进制数精确表示,同样的方法也不能用十进制数精确地写出1/3。

你应该做的是这样的事情:

index = abs([sol.a] - (NewParam1 - deltaParam1)) < 1e-10 & ...
        abs([sol.b] - (NewParam2 - deltaParam2)) < 1e-10;

我实际上建议不要使用eps,因为它太小而在某些情况下可能实际上失败了。但是,如果您需要非常高的准确度,您可以使用小于1e-10的数字(但我们多久使用一次小于1e-10的数字)?