Matlab计算多个同尺寸三维.mat文件对应元素长期均值的方法
Matlab实现多.mat三维矩阵逐位置长期均值计算落地方案
适用场景:2000-2020年共21个尺寸为72×70×8760(纬度×经度×时序值)的.mat格式数据,计算所有文件对应格点位置的长期均值,输出同尺寸.mat结果文件。
前置准备
- 新建一个独立文件夹,把21个待处理的原始.mat文件全部放进去,文件夹路径不要包含中文,避免老版本Matlab识别报错
- 提前确认所有.mat文件内存储三维矩阵的变量名一致(可单独加载一个文件到Matlab工作区查看变量名,比如多数人存的变量名是
data/pre/temp这类) - 提前排查坏文件:确认每个文件内的矩阵尺寸都是72×70×8760,没有缺维、损坏的文件
完整可直接运行代码
把代码复制到Matlab脚本文件里,按照注释修改对应参数即可运行:
%% 第一步:配置文件路径 % 替换成你自己存放21个原始mat文件的文件夹路径,比如Windows下复制文件夹地址栏的路径粘贴进来即可 input_folder = 'D:\climate_data\yearly_mat'; % 自动扫描文件夹下所有后缀为.mat的文件 file_list = dir(fullfile(input_folder, '*.mat')); file_num = length(file_list); % 自动校验文件数量,不是21个直接报错提醒 if file_num ~= 21 error('当前文件夹下检测到%d个.mat文件,不是需要的21个,请检查路径是否正确、是否混入其他mat文件', file_num); end %% 第二步:预分配内存创建累积矩阵 % 初始化一个和目标尺寸完全一致的全零矩阵,预分配内存可以大幅提升运行速度 long_term_mean = zeros(72, 70, 8760); %% 第三步:循环读取所有文件累加数值 for idx = 1:file_num % 拼接当前读取文件的完整路径 current_path = fullfile(file_list(idx).folder, file_list(idx).name); % 读取mat文件,注意把这里的'data'替换成你自己文件里的实际变量名 load_res = load(current_path, 'data'); current_mat = load_res.data; % 自动校验当前文件的矩阵尺寸,不符合要求直接报错提示 if ~isequal(size(current_mat), [72, 70, 8760]) error('第%d个文件「%s」的矩阵尺寸不符合72×70×8760的要求,请检查文件', idx, file_list(idx).name); end % 把当前矩阵的数值累加到结果矩阵上 long_term_mean = long_term_mean + current_mat; % 打印进度,方便查看运行状态 fprintf('已完成%d/%d个文件的读取累加\n', idx, file_num); end %% 第四步:计算平均值 % 总共有21年的数据,累加值除以21就是对应位置的长期均值 long_term_mean = long_term_mean / 21; %% 第五步:保存结果为.mat格式 % 结果默认存在原始数据文件夹里,文件名为long_term_mean.mat,变量名和原始维度保持一致 save(fullfile(input_folder, 'long_term_mean.mat'), 'long_term_mean'); fprintf('全部计算完成,结果文件已保存到指定文件夹\n');
初学者操作注意事项
- 变量名替换:如果你的.mat文件里的矩阵变量名不是
data,需要把代码里load函数里的'data',以及load_res.data里的data统一替换成你自己的实际变量名,否则会报找不到变量的错 - 结果文件存放:计算得到的
long_term_mean.mat如果和原始文件存在同一个文件夹里,下次重新跑代码前一定要把这个结果文件移出去,否则代码会把它当成原始文件读入,触发文件数量校验报错 - 内存不足处理:如果运行时提示内存不足,先在命令行输入
clear清空当前工作区的其他冗余变量再运行,单份72×70×8760的双精度矩阵仅占28MB左右,普通办公电脑完全可以流畅运行 - 结果校验:跑完可以随机选1-2个格点位置(比如第10行第20列第100个时次),手动提取21个文件对应位置的数值算平均值,和输出结果对比,确认计算逻辑正确
内容的提问来源于stack exchange,提问作者Lisa
相关产品推荐
相关产品推荐

