基于MATLAB Simulink的Average Curve:多条曲线线性插值与唯一排序横坐...

基于MATLAB Simulink的Average Curve:多条曲线线性插值与唯一排序横坐... Average Curve基于MATLAB/Simulink的通过线性插值返回多条曲线的平均曲线。 返回的平均曲线也具有唯一的和排序的横坐标。最近在整理实验数据的时候遇到个头疼的问题——同一组测试里不同样本的曲线横坐标对不上想算个平均值都费劲。比如测了五台电机的转速-温度曲线采样时间点全都不一样这时候要画个平均曲线该咋整总不能在Excel里手动对齐吧这时候发现MATLAB有个挺聪明的思路既然各曲线横坐标不统一那就先给它们找个公共的横坐标基准。具体来说就是先把所有原始数据的x值收集起来去重排序后作为新基准然后把所有曲线都用线性插值对齐到这个基准上最后直接算y值的平均数。先看核心函数怎么写的function [x_avg, y_avg] average_curve(x_cell, y_cell) % 合并所有横坐标 all_x cell2mat(cellfun((x) x(:), x_cell, UniformOutput, false)); x_common unique(all_x); % 去重排序 x_avg sort(x_common); % 初始化存储矩阵 y_interp zeros(length(x_avg), length(x_cell)); % 逐条插值 for k 1:length(x_cell) [x_unique, idx] unique(x_cell{k}); y_unique y_cell{k}(idx); y_interp(:,k) interp1(x_unique, y_unique, x_avg, linear, extrap); end % 计算平均 y_avg mean(y_interp, 2); end这段代码有几个亮点值得说用cellfun快速展开所有曲线的x值比写循环清爽多了。注意这里传参用的是元胞数组能处理不同长度的曲线数据unique函数自带排序功能省去了手动调用sort的麻烦还自动过滤掉重复点插值前先对原始数据做unique处理避免输入数据中有重复x值导致interp1报错最后用矩阵运算代替循环做平均MATLAB的向量化操作真香在Simulink里应用时可以把这个算法封装成自定义模块。实测处理20条采样率不同的传感器曲线耗时不到0.3秒。有个坑要注意当某条曲线的x范围小于公共基准时extrap参数会让它自动外推这在某些场景下可能引入误差建议根据实际情况选择是否保留。举个实际案例假设我们有三组发动机转速200-300rpm随机采样对应的燃油效率数据用这个算法得到的平均曲线不仅平滑度适中还能准确反映效率拐点。比起简单粗暴的每100rpm分段平均插值法保留了更多细节特征。最后给个可视化彩蛋——用动画展示平均曲线的生成过程figure; hold on; colors lines(length(x_cell)); % 绘制原始曲线 for n 1:length(x_cell) plot(x_cell{n}, y_cell{n}, Color,[colors(n,:),0.3],LineWidth,0.5); end % 逐点绘制平均曲线 h plot(x_avg(1), y_avg(1), k,LineWidth,2); for m 2:length(x_avg) set(h,XData,x_avg(1:m),YData,y_avg(1:m)) drawnow pause(0.01) end这个动态演示特别适合在组会上展示比静态图表更能体现数据对齐的过程。说到底处理非对齐曲线的关键就是先统一坐标系再操作这思路在深度学习里的数据对齐、信号处理中的时域对齐也通用。