Average Curve:基于MATLAB/Simulink的通过线性插值返回多条曲线的平均曲线

Average Curve:基于MATLAB/Simulink的通过线性插值返回多条曲线的平均曲线。 返回的平均曲线也具有唯一的和排序的横坐标。

最近在整理实验数据的时候遇到个头疼的问题------同一组测试里不同样本的曲线横坐标对不上,想算个平均值都费劲。比如测了五台电机的转速-温度曲线,采样时间点全都不一样,这时候要画个平均曲线该咋整?总不能在Excel里手动对齐吧?

这时候发现MATLAB有个挺聪明的思路:既然各曲线横坐标不统一,那就先给它们找个公共的横坐标基准。具体来说就是先把所有原始数据的x值收集起来,去重排序后作为新基准,然后把所有曲线都用线性插值对齐到这个基准上,最后直接算y值的平均数。

Average Curve:基于MATLAB/Simulink的通过线性插值返回多条曲线的平均曲线。 返回的平均曲线也具有唯一的和排序的横坐标。

先看核心函数怎么写的:

matlab 复制代码
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

这段代码有几个亮点值得说:

  1. cellfun快速展开所有曲线的x值,比写循环清爽多了。注意这里传参用的是元胞数组,能处理不同长度的曲线数据
  2. unique函数自带排序功能,省去了手动调用sort的麻烦,还自动过滤掉重复点
  3. 插值前先对原始数据做unique处理,避免输入数据中有重复x值导致interp1报错
  4. 最后用矩阵运算代替循环做平均,MATLAB的向量化操作真香

在Simulink里应用时,可以把这个算法封装成自定义模块。实测处理20条采样率不同的传感器曲线,耗时不到0.3秒。有个坑要注意:当某条曲线的x范围小于公共基准时,'extrap'参数会让它自动外推,这在某些场景下可能引入误差,建议根据实际情况选择是否保留。

举个实际案例:假设我们有三组发动机转速(200-300rpm随机采样)对应的燃油效率数据,用这个算法得到的平均曲线不仅平滑度适中,还能准确反映效率拐点。比起简单粗暴的每100rpm分段平均,插值法保留了更多细节特征。

最后给个可视化彩蛋------用动画展示平均曲线的生成过程:

matlab 复制代码
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

这个动态演示特别适合在组会上展示,比静态图表更能体现数据对齐的过程。说到底,处理非对齐曲线的关键就是先统一坐标系再操作,这思路在深度学习里的数据对齐、信号处理中的时域对齐也通用。

相关推荐
stillaliveQEJ8 天前
【项目实战】zookeeper+dubbo搭建分布式项目
spring boot·分布式·java-zookeeper
云技纵横17 天前
订票系统高并发实战:基于 ZooKeeper 的分布式锁、选座与幂等回滚(Java/Curator)
分布式·zookeeper·java-zookeeper
hid558845361 个月前
用三次样条插值法求解信号包络线的Matlab实现
java-zookeeper
koping_wu2 个月前
【Zookeeper】数据结构、集群原理、选举机制
数据结构·zookeeper·java-zookeeper
沧海寄馀生2 个月前
Apache Hadoop生态组件部署分享-zookeeper
hadoop·zookeeper·eclipse·apache·java-zookeeper
西岭千秋雪_2 个月前
Kafka安装和使用
java·分布式·kafka·java-zookeeper
海域云SeaArea_2 个月前
CentOS7 单机安装 Zookeeper 3.5.8(JDK 1.8 环境)
java·zookeeper·java-zookeeper
黄暄3 个月前
微服务面试题(14题)
java·spring cloud·微服务·架构·java-rabbitmq·java-zookeeper
suuijbd3 个月前
SpringCloud+Netty集群即时通讯项目
spring boot·分布式·spring cloud·java-rabbitmq·java-zookeeper