在MATLAB中使用find函数的问题

Pet*_*lls 2 floating-point matlab find

我有两个数据阵列,我正试图合并.一个包含来自第一列实验的实际延迟(例如0.345,0.455 ...从不超过3个小数位),以及该实验的其他数据.另一个包含有效的"查找"延迟列表,范围从0.001到0.500,以0.001为增量,以及其他数据.两个数据集都是X-by-Y双精度数.

我想做的是......

for i = 1:length(actual_latency) 
   row = find(predicted_data(:,1) == actual_latency(i))
   full_set(i,1:4) = [actual_latency(i) other_info(i) predicted_info(row,2) ...
                      predicted_info(row,3)];
end
Run Code Online (Sandbox Code Playgroud)

...为了找到predicted_data查找延迟对应于实际延迟的相关行.然后我用它来创建一个合并的数据集full_set.

我想这将是非常简单的,但查找功能一直被扔了寻找一个实际的等待时间,我当空矩阵未能知道是predicted_data(:,1)(因为我已经双重检查调试期间).

此外,如果我用for循环替换find来做同样的工作,我会得到类似的错误.它似乎不是系统性的 - 使用不同的参与者数据集会在不同的地方引发它.

此外,在调试模式下,如果我使用find来尝试查找硬编码值actual_latency,它并不总是有效.有时是,有时没有.

我真的对此感到头疼,所以如果有人对可能发生的事情有任何想法,我会非常感激.

gno*_*ice 5

执行以下操作时,您可能会遇到浮点比较问题:

predicted_data(:,1) == actual_latency(i)
Run Code Online (Sandbox Code Playgroud)

即使您的数字看起来只有三位小数的精度,但它们可能仍然存在非常小的未显示的数量,从而为您提供空矩阵,因为FIND无法获得完全匹配.

浮点数的一个特征是某些数字不能精确表示,因为它们不是2的整数幂.这与数字0.1和0.001一起出现.如果您反复添加或乘以其中一个数字,您可以看到一些意外行为.Amro在他的评论中指出了一个例子:0.3并不完全等于3*0.1.这也可以通过以两种不同的方式创建延迟查找列表来说明.您可以使用普通冒号语法:

vec1 = 0.001:0.001:0.5;
Run Code Online (Sandbox Code Playgroud)

或者您可以使用LINSPACE:

vec2 = linspace(0.001,0.5,500);
Run Code Online (Sandbox Code Playgroud)

你会认为这两个向量彼此相等,但再想一想!:

>> isequal(vec1,vec2)

ans =

     0  %# FALSE!
Run Code Online (Sandbox Code Playgroud)

这是因为这两种方法通过以不同方式执行0.001的连续加法或乘法来创建向量,从而为向量中的某些条目提供了略微不同的值.您可以查看此技术解决方案以获取更多详细信息.

比较浮点数时,您应该使用一些容差进行比较.例如,这会查找查找列表中的条目索引,这些索引在实际延迟的0.0001范围内:

tolerance = 0.0001;
for i = 1:length(actual_latency)
  row = find(abs(predicted_data(:,1) - actual_latency(i)) < tolerance);
  ...
Run Code Online (Sandbox Code Playgroud)

浮点比较的主题也包含在这个相关问题中.

  • 我想给出浮点比较的一个简单例子是:`(0.3 == 0.1*3)`[这将评估为假!] (2认同)