考虑以下示例:
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。
答案 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