【问题标题】:MATLAB decimal places in arrayMATLAB 数组中的小数位
【发布时间】:2012-11-17 02:12:09
【问题描述】:

考虑以下示例:

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。

【问题讨论】:

  • 浮点运算的特性是关于 SO 的常见问题来源。我建议你在做任何其他事情之前先阅读标签 floating-point 下的一些 Qs 和 As。对于像我猜想你这样的潜在计算科学家来说,这是一个非常重要的话题。如果您不了解风险和陷阱,您编写的程序可能包含细微的错误,这些错误可能不会在崩溃或错误消息中体现出来;他们可能会等到您发布错误的结果。

标签: matlab find


【解决方案1】:

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

1/3 == 0.333333333333333333...

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

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

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

【讨论】:

    【解决方案2】:

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

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

    newDepth = round(newDepth * 10) / 10
    

    【讨论】:

      【解决方案3】:

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

      您想将比较更改为类似的东西

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-04-13
        • 2011-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多