Labfans是一个针对大学生、工程师和科研工作者的技术社区。 论坛首页 | 联系我们(Contact Us)
MATLAB爱好者论坛-LabFans.com
返回   MATLAB爱好者论坛-LabFans.com > 其它 > 资料存档
资料存档 资料存档
回复
 
主题工具 显示模式
旧 2019-12-10, 20:41   #1
poster
高级会员
 
注册日期: 2019-11-21
帖子: 3,006
声望力: 66
poster 正向着好的方向发展
帖子 在MATLAB中使用查找功能时出现问题

我有两个要合并的数据数组。第一列中包含实验的实际延迟(例如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); ... 浮点比较的主题也包含在此相关问题中



更多&回答...
poster 当前离线   回复时引用此帖
回复


发帖规则
不可以发表新主题
不可以发表回复
不可以上传附件
不可以编辑自己的帖子

启用 BB 代码
论坛禁用 表情符号
论坛启用 [IMG] 代码
论坛启用 HTML 代码



所有时间均为北京时间。现在的时间是 06:46


Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.