1

考虑以下示例:

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 的数组,特别是在 newDepth == 11.6 的第 117 列,我注意到该值不等于 11.6 但等于 11.600000000000001,因此与 Depth(8) 不同。我怎样才能解决这个问题?为什么 MATLAB 不只是将值写为 11.6?我没有指定在任何地方包含 .000000000000001。

4

3 回答 3

0

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

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

newDepth = round(newDepth * 10) / 10
于 2012-11-16T10:11:53.723 回答
0

11.6000000000000001 是因为数字 11.6 不能用二进制浮点表示法精确表示。这与硬件的工作方式有关,而不是 Matlab 的任何限制。

您想将比较更改为类似

dd(i) = find(abs(newDepth - Depth(i))<.0000001);
于 2012-11-16T10:19:14.730 回答
0

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

1/3 == 0.333333333333333333...

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

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

for ii = 1:length(Depth);
    [~,dd(ii)] = min( abs(newDepth-Depth(ii)) );
end
于 2012-11-16T10:20:04.280 回答