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,提问作者גיא בורנשטיין
相关产品推荐
相关产品推荐

