我有两个要合并的数据数组。第一列中包含实验的实际延迟(例如0.345、0.455 ...永远不超过3个小数位),以及该实验的其他数据。另一个包含有效的“查找”延迟列表,范围从0.001到0.500(以0.001为增量),以及其他数据。这两个数据集都是X乘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 ...以便在predicted_data中找到相关行,其中查找等待时间对应于实际等待时间。然后,我用它来创建一个合并的数据集full_set 。
我认为这确实很简单,但是当寻找我
知道在predicted_data(:,1)的实际延迟时(由于我在调试过程中进行了双重检查),find函数会因抛出空矩阵而失败。
而且,如果我用for循环替换find来完成相同的工作,则会收到类似的错误。它似乎不是系统性的-使用不同的参与者数据集会将其放置在不同的位置。
此外,在调试模式下,如果我使用find来尝试找到一个actual_latency的硬编码值,那么它并不总是有效。有时是,有时不是。
我真的很想解决这个问题,因此,如果有人对可能发生的事情有任何想法,我将不胜感激。
回答:
执行以下操作时,您可能会遇到浮点比较问题:
predicted_data(:,1) == actual_latency(i) 即使您的数字
似乎只具有三个小数位精度,它们也可能相差很小,没有显示出来,因此由于
FIND无法获得
精确匹配,因此给您提供了一个空矩阵。
浮点数的一个特征是某些数字不能精确表示,因为它们不是2的整数次方。这在数字0.1和0.001时发生。如果您重复加或乘这些数字之一,您会看到一些意外的行为。阿姆罗在评论中指出了一个例子: 0.3不
完全等于3*0.1 。这也可以通过以两种不同方式创建延迟查找列表来说明。您可以使用普通的
冒号语法 :
vec1 = 0.001:0.001:0.5; 或者您可以使用
LINSPACE :
vec2 = linspace(0.001,0.5,500); 您可能会认为这两个向量彼此相等,但是请再考虑一下!:
>> isequal(vec1,vec2) ans = 0 %# FALSE! 这是因为这两种方法通过以不同方式执行0.001的连续加法或乘法来创建向量,从而为向量中的某些条目提供了稍有不同的值。您可以查看
此技术解决方案以了解更多详细信息。
因此,在比较浮点数时,应使用一些容差进行比较。例如,这将查找查找列表中条目的索引,这些索引在您的实际延迟的0.0001以内:
tolerance = 0.0001; for i = 1:length(actual_latency) row = find(abs(predicted_data(:,1) - actual_latency(i)) < tolerance); ... 浮点比较的主题也包含在此
相关问题中 。
更多&回答...