我正在将程序从MATLAB 2012转换为2016。我遇到了一些奇怪的错误,我相信其中一些是由于MATLAB函数的精度不足所致。
例如,我有一个时间序列oldTs
:
Time Data
-----------------------------
1.00000000000000001 1.277032377439511
1.00000000000000002 1.277032378456123
1.00000000000000003 1.277032380112478
我还有另一个时间序列newTs
,它的数据相似,但是有更多的行。 oldTs
可能有500万行,而newTs
可能有100万行。我想用新的时间序列插入旧时间序列中的数据,例如:
interpolatedTs = interp(oldTs.time, oldTs.data, newTs.time)
这给我一个错误:x values must be distinct
问题是,我的x值 是不同的。我认为MATLAB可能会截断某些数据,因此认为某些数据不是唯一的。我发现其他MATLAB函数可以做到这一点:
test = [1.00000000000000001, 1.00000000000000002, 1.0000000000000000003]
unique(test)
ans =
1
test2 = [10000000000000000001, 10000000000000000002, 10000000000000000003]
unique(test2)
ans =
1.000000000000000e+19
MATLAB认为此向量中只有一个唯一值,而不是三个!对我来说,这是一个巨大的问题,因为我需要使用数据保持最高的准确性和精度,而我不能牺牲任何精度。速度/存储不是一个因素。
默认情况下,某些MATLAB函数是否将数据截断到第n个小数位?这已从MATLAB 2012更改为MATLAB 2016吗?有没有一种方法可以强制MATLAB对程序使用一定的精度?为什么MATLAB首先要这样做?
任何对此主题的了解都值得赞赏。谢谢。
答案 0 :(得分:1)
不,自2012年以来,或者从MATLAB的第一个版本开始,情况就没有改变。 MATLAB默认情况下使用并且一直使用双精度浮点值(8字节)。可以表示的第一个大于1的值是1 + eps(1)
,带有eps(1) = 2.2204e-16
。基本上,您可以玩的少于16个十进制数字。在双精度浮点表示中,您的值1.00000000000000001
与1
相同。
请注意,这不是特定于MATLAB的东西,它是您的硬件遵循的标准。 MATLAB仅使用您的硬件功能。
使用Symbolic Math Toolbox中的variable precision arithmetic处理更高精度的数字:
data = [vpa(1) + 0.00000000000000001
vpa(1) + 0.00000000000000002
vpa(1) + 0.00000000000000003]
data =
1.00000000000000001
1.00000000000000002
1.00000000000000003
请注意,vpa(1.00000000000000001)
将不起作用,因为该数字首先被解释为双精度浮点值,并且只有在转换为VPA之后,但损坏已在那一点上完成。
还请注意,使用VPA进行算术的速度要慢得多,并且可能根本无法进行某些操作。