在MATLAB中如何确定两条曲线图的交点并按规则标注?
MATLAB 折线交点识别与差异化标注实现
直接给出可运行的完整实现代码,适配你描述的需求逻辑:
% 定义原始数据 a = [1, 3, 5, 3, 1]; b = [0, 4, 2, 4, 6]; % 绘制基础折线图,指定颜色避免默认配色歧义 plot(a, 'b', 'LineWidth', 1.5) hold on plot(b, 'r', 'LineWidth', 1.5) % 计算蓝色曲线a与红色曲线b的差值 diff_ab = a - b; n = length(diff_ab); % 遍历所有相邻采样点判断是否存在交叉 for i = 1:n-1 % 相邻点差值符号相反代表两条线在该区间内交叉 if prod(diff_ab(i:i+1)) < 0 % 线性插值计算交点精确坐标 x1 = i; x2 = i+1; a1 = a(i); a2 = a(i+1); x_cross = x1 + (0 - diff_ab(i)) * (x2 - x1) / (diff_ab(i+1) - diff_ab(i)); y_cross = interp1([x1,x2],[a1,a2],x_cross); % 判断穿越方向 if diff_ab(i) > 0 && diff_ab(i+1) < 0 % 红色曲线向上穿越蓝色曲线,标注实心红点 plot(x_cross, y_cross, 'ro', 'MarkerFaceColor', 'r', 'MarkerSize', 8) elseif diff_ab(i) < 0 && diff_ab(i+1) > 0 % 红色曲线向下穿越蓝色曲线,标注空心红点 plot(x_cross, y_cross, 'ro', 'MarkerSize', 8) end end end hold off grid on legend('蓝色曲线a','红色曲线b','向上穿越交点','向下穿越交点','Location','best')
补充说明
- 代码默认处理交点在两个采样点之间的场景,如果两条曲线正好在采样点位置重合相交,你可以额外增加
diff_ab(i) == 0的分支,结合前后差值的符号判断穿越方向即可。 - 运行你提供的示例数据,最终会得到3个交点,分别对应2次向上穿越、1次向下穿越,标注效果符合需求。
内容的提问来源于stack exchange,提问作者Leo
相关产品推荐
相关产品推荐

