如何基于逻辑数组分割并绘制数组数据?
高效提取并绘制Matlab中的分段数据
针对你的需求,这里提供两种无需(或仅少量)循环的高效实现方案:
方法一:利用NaN自动断开线条(最简方案)
Matlab的plot函数遇到NaN值会自动断开线条,只需将不需要绘制的位置替换为NaN,直接绘图就能完成分段效果,全程无需循环:
x = 1:1:10; y = ones(size(x)); segmentation = logical([1 1 1 1 0 0 0 0 1 1]); % 将不需要绘制的位置设为NaN x_plot = x; y_plot = y; x_plot(~segmentation) = NaN; y_plot(~segmentation) = NaN; figure; hold on; plot(x, y, 'b-o', 'DisplayName', '原始数据'); plot(x_plot, y_plot, 'r--x', 'DisplayName', '分段绘制结果'); legend;
此方法代码极简,执行效率最高,适合所有分段使用统一样式的场景。
方法二:提取分段起止索引,批量生成绘图参数
如果需要对不同分段设置个性化样式(比如不同颜色、标记),可以先通过diff定位所有分段的起始和结束索引,再批量构建绘图参数:
x = 1:1:10; y = ones(size(x)); segmentation = logical([1 1 1 1 0 0 0 0 1 1]); % 计算分段的边界位置 seg_diff = diff([0; segmentation(:); 0]); starts = find(seg_diff == 1); ends = find(seg_diff == -1) - 1; % 构建绘图参数列表 plot_args = {}; for i = 1:length(starts) % 可在此处为每个分段单独设置样式 plot_args = [plot_args, x(starts(i):ends(i)), y(starts(i):ends(i)), 'r--x']; end figure; hold on; plot(x, y, 'b-o', 'DisplayName', '原始数据'); plot(plot_args{:}, 'DisplayName', '分段绘制结果'); legend;
这里的循环仅针对分段数量(而非原始数据长度),效率依然很高,且支持灵活调整每个分段的绘图样式。
内容的提问来源于stack exchange,提问作者Olbert Daemmerer
相关产品推荐
相关产品推荐

