You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Matlab实现移动平均与标准差绘图及多文件分钟均值统计求助

解决Matlab中移动平均、标准差曲线绘制及多文件分钟均值汇总问题

我仔细看了你的需求和现有代码,咱们一步步修复问题并实现所有功能:你的代码目前只能计算前60秒的整体均值,而且标准差是全局值(画出来是一条直线),接下来咱们修改代码实现随时间变化的移动平均曲线、移动标准差波动范围曲线,以及所有文件的每分钟均值汇总图。

一、单个文件的移动平均与标准差曲线修复

Matlab自带的movmean和movstd函数可以轻松实现移动统计量计算,你只需要指定合适的窗口大小(可根据数据采样密度调整)。以下是修改后的完整逻辑:

修改后的核心代码

clc,clear; 
myDir = 'your_path_here'; % 替换成你的文件夹实际路径
dirInfo = dir([myDir,'*.txt']); 
filenames = {dirInfo.name}; 
N = numel(filenames); 

% 预分配数组,存储所有文件的每分钟均值,用于后续汇总
all_minute_means = [];

for i=1:N 
    fid = fopen([myDir,filenames{i}] ); 
    data{i} = textscan(fid,'%f %f','headerlines',2); 
    fclose(fid); 
    temp1=data{i,1}; 
    time=temp1{1}; 
    level=temp1{2}; 

    % --- 1. 计算移动平均和移动标准差 ---
    window_size = 383; % 按你的数据量(22973点/60秒≈383点/秒),设为1秒窗口大小
    moving_avg = movmean(level, window_size); % 移动平均
    moving_std = movstd(level, window_size); % 移动标准差(加参数0可切换为总体标准差)

    % --- 2. 绘制单文件可视化图 ---
    figure(i); 
    % 原始数据用灰色弱化,避免遮挡关键曲线
    plot(time, level, 'Color', [0.7,0.7,0.7], 'DisplayName', '原始Level数据'); 
    hold on;
    plot(time, moving_avg, 'b-', 'LineWidth', 1.5, 'DisplayName', '1秒移动平均');
    plot(time, moving_avg + moving_std, 'r--', 'DisplayName', '平均+标准差');
    plot(time, moving_avg - moving_std, 'r--', 'DisplayName', '平均-标准差');
    xlim([0 60]); 
    xlabel('时间 (秒)');
    ylabel('Level数值');
    title(['文件: ', filenames{i}]);
    legend('Location', 'best');
    grid on;
    hold off;

    % --- 3. 提取当前文件的每分钟均值,用于后续汇总 ---
    minutes = floor(time / 60); % 将时间转换为分钟整数
    unique_minutes = unique(minutes);
    minute_means = zeros(size(unique_minutes));
    % 计算每个分钟区间的均值
    for m = 1:length(unique_minutes)
        idx = minutes == unique_minutes(m);
        minute_means(m) = mean(level(idx));
    end
    % 对齐所有文件的分钟索引(补0确保长度一致)
    max_minute = max(unique_minutes);
    if isempty(all_minute_means)
        all_minute_means = zeros(N, max_minute+1);
    else
        if size(all_minute_means,2) < max_minute+1
            all_minute_means = [all_minute_means, zeros(N, max_minute+1 - size(all_minute_means,2))];
        else
            minute_means = [minute_means, zeros(1, size(all_minute_means,2) - length(minute_means))];
        end
    end
    all_minute_means(i,:) = minute_means;
end

% --- 二、绘制所有文件的每分钟均值汇总图 ---
figure(N+1);
mean_across_files = mean(all_minute_means, 1); % 计算每个分钟的跨文件均值
minutes_axis = 0:length(mean_across_files)-1; % 生成分钟坐标轴
plot(minutes_axis, mean_across_files, 'g-', 'LineWidth', 2);
xlabel('时间 (分钟)');
ylabel('所有文件的Level均值');
title('32个文件每分钟Level均值汇总');
grid on;

关键修改说明:

  • 移动统计量计算:用movmean和movstd替代全局均值/标准差,窗口大小window_size可根据需求调整(比如想做5分钟移动平均,就设为383605)。
  • 标准差可视化:绘制了移动平均±标准差两条曲线,直观展示数据的波动范围,替代了原来无意义的全局标准差直线。
  • 单文件图优化:添加了坐标轴标签、标题、网格,用灰色弱化原始数据,突出核心的移动平均和波动曲线。

二、多文件分钟均值汇总实现

代码中新增all_minute_means数组存储每个文件的每分钟均值,最后通过mean(all_minute_means, 1)计算每个分钟的跨文件均值并绘图。同时做了分钟索引对齐处理,确保不同文件的时间区间长度一致,避免索引错误。

如果需要调整时间分组粒度(比如每30秒),只需要把floor(time/60)改成floor(time/30)即可。

内容的提问来源于stack exchange,提问作者גיא בורנשטיין

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:43:30