数组中的MATLAB小数位

时间:2012-11-16 09:59:35

标签: matlab find

考虑以下示例:

Bathymetry = [0,4134066;
    3,3817906;
    6,3343666;
    9,2978725;
    12,2742092;
    14,2584337;
    16,2415355;
    18,2228054;
    20,2040753;
    23,1761373;
    26,1514085];

Depth = [0;1;2;3;5;8;10;11.6;15];

newDepth = min(Bathymetry(:,1)):0.1:max(Bathymetry(:,1));

由此我想找到'newDepth'的哪一列对应'Depth'。例如:

dd = find(newDepth==Depth(1))
dd =

     1

显示Depth == 0,位于newDepth的第一列。当我将其应用于'深度'

的所有条目时
for i = 1:length(Depth);
    dd(i) = find(newDepth == Depth(i));
end

我收到错误:

Improper assignment with rectangular empty matrix.

最初我无法理解为什么,但是通过查看newDepth的数组,尤其是第117行newDepth == 11.6,我注意到该值不等于11.6但等于11.600000000000001因此与Depth(8)不同。我怎样才能解决这个问题?为什么MATLAB不只是将值写为11.6?我没有指定包含.000000000000001。

3 个答案:

答案 0 :(得分:0)

这个问题是浮点运算相当复杂,我建议你google它并阅读一下,有很多解释它。这是一个好的开始:http://blogs.mathworks.com/loren/2006/08/23/a-glimpse-into-floating-point-accuracy/

为了解决你的情况,我建议四舍五入

newDepth = round(newDepth * 10) / 10

答案 1 :(得分:0)

11.600000000000001是因为数字11.6在二进制浮点表示法中不能完全表示。这与硬件的工作方式有关,而不是对Matlab的任何限制。

您希望将比较更改为

dd(i) = find(abs(newDepth - Depth(i))<.0000001);

答案 2 :(得分:0)

这是因为二进制中没有精确的0.1表示。阅读the wiki了解更多背景信息。在二进制中,代表0.1就像试图写出三分之一的所有小数:

1/3 == 0.333333333333333333...

无论你添加了多少3,它都永远不会是准确的。

出于这个(以及其他许多)原因,我建议你不要使用==(这是一个非常严格的要求),而是使用

for ii = 1:length(Depth);
    [~,dd(ii)] = min( abs(newDepth-Depth(ii)) );
end