Matlab查找参考线左侧最近点误选右侧点问题求解
问题描述
需要实现参考线左侧点位匹配查找功能,所有待匹配点位已提前存储在独立数组中。先后测试Matlab的dsearchn、rangesearch、knnsearch三种近邻搜索方法,整体运行准确率约80%,存在明确缺陷:当参考线左侧的目标点距离参考线较远时,算法会错误选中参考线右侧的点位,最终导致绘图时填充区域重叠。
预期效果是黄色、红色填充块按顺序排布,实际运行时两类填充块会出现异常重叠。
现有实现代码
close all load data.mat % 转换Beg_Ex、Beg_In为对应时间值 Beg_Ex1 = Time(Beg_Ex); Beg_In1 = Time(Beg_In); % 查找Beg_Ex到Block1的匹配点 Beg = Block1(:,1); End_Cycle11 = dsearchn(Beg_Ex1',Beg); End_Cycle1 = Beg_Ex1(End_Cycle11); % 呼气相周期点 % 呼吸暂停前第一半周期区间 Start_Stop1 = [End_Cycle1' Beg]; % 查找Beg_In到EndCycle1的匹配点 End_Cycle22 = dsearchn(Beg_In1',End_Cycle1'); End_Cycle2 = Beg_In1(End_Cycle22); % 吸气相周期点 % 呼吸暂停前第二半周期区间 Start_Stop2 = [End_Cycle2' End_Cycle1']; plot(Time,Flow,'b'); hold on; plot(Time(Beg_Ex),Flow(Beg_Ex),'ro','MarkerFaceColor','r','MarkerSize',10) hold on; plot(Time(Beg_In),Flow(Beg_In),'go','MarkerFaceColor','g','MarkerSize',10) grid on title('Flow') xlabel('time [s]') ylabel('flow [a.u.]') vfill( Start_Stop1,'r','facealpha',.6,'edgecolor','k','linestyle',':'); hold on; vfill( Start_Stop2,'y','facealpha',.6,'edgecolor','k','linestyle',':');
代码中调用的vfill为Matlab社区公开的垂直区域填充第三方函数。
可行解决思路
- 给近邻搜索增加方位硬约束:
dsearchn等默认近邻函数只返回全局欧氏距离最近的点,本身不带方位判断逻辑,天然不满足“仅查找左侧点”的需求。匹配前先通过叉乘判断所有待选点位相对于参考线的方位:取参考线上对应线段的两个端点A、B,对待判断点P计算向量AB与向量AP的叉乘,根据叉乘符号即可判定P在参考线的左侧还是右侧,直接筛除所有右侧点位,仅在剩余左侧候选点中执行最近邻查找,从根源上避免选中右侧点。 - 增加时序单调性约束:该场景处理的是时间序列的呼吸周期数据,所有周期节点的时间戳严格按先后顺序排列。每次执行近邻搜索时,提前根据上一个匹配到的周期点时间戳划定搜索范围,仅在符合时序先后要求的区间内查找候选点,避免跨周期匹配到距离更近但时序错误的点位。
- 替换无约束的全局搜索逻辑:不要直接调用无约束的内置近邻函数,自行实现带双重过滤的匹配流程:对每个待匹配的参考点,第一步先筛除参考线右侧的点,第二步筛除不符合时序范围的点,最后在剩下的有效候选点中选取距离最近的点作为匹配结果,可完全避免匹配错误。
内容的提问来源于stack exchange,提问作者Ganesh
相关产品推荐
相关产品推荐

