Matlab如何用while循环自动处理编号递增的同测量变量数据表
解决方案
Matlab 不推荐直接动态生成
data_1/Temp_1这类带数字后缀的变量,这类变量无法被代码静态检查工具识别,调试和后续索引都非常麻烦,优先用**元胞数组(cell array)**存储多份结构相同的表格与计算结果。
实现步骤
步骤1:整理文件名列表
首先把所有要读取的文件路径整理到一个元胞数组里,如果文件名没有统一命名规则,手动枚举即可:
file_list = { 'file_xy', ... 'file_zy', ... 'file_zz', ... % 按实际顺序补全所有需要读取的文件名 }; total_file = length(file_list);
如果文件名有数字规律(比如file_1.csv、file_2.csv),可以用sprintf批量生成,不用手动输入:
total_file = 50; file_list = arrayfun(@(k) sprintf('file_%d.csv', k), 1:total_file, 'UniformOutput', false);
步骤2:循环读取与处理
分两种使用场景选择写法:
场景1:仅需保留计算结果,不需要留存原始表格(省内存)
直接边读边处理,用数组预先存储结果避免循环内动态扩容:
% 先获取单样本结果的维度,提前定义存储数组 sample_data = readtable(file_list{1}); sample_temp = mean([sample_data.tempx(:), sample_data.tempz(:)], 2); sample_p = mean([sample_data.px(:), sample_data.pz(:)], 2); % 初始化存储数组,列对应不同文件的计算结果 Temp = zeros(length(sample_temp), total_file); p = zeros(length(sample_p), total_file); % 已知循环次数优先用for,比while更简洁不易出错 for k = 1:total_file current_data = readtable(file_list{k}); Temp(:,k) = mean([current_data.tempx(:), current_data.tempz(:)], 2); p(:,k) = mean([current_data.px(:), current_data.pz(:)], 2); end
后续要调用第k个文件的结果,直接取Temp(:,k)、p(:,k)即可,非常方便做跨样本对比。
场景2:需要留存所有原始表格,后续会反复调用
先把所有表格读取到元胞数组存储,再做后续处理:
% 读取所有表格存入元胞数组 data_cell = cell(total_file, 1); for k = 1:total_file data_cell{k} = readtable(file_list{k}); end % 处理逻辑 Temp = cell(total_file, 1); p = cell(total_file, 1); for k = 1:total_file Temp{k} = mean([data_cell{k}.tempx(:), data_cell{k}.tempz(:)], 2); p{k} = mean([data_cell{k}.px(:), data_cell{k}.pz(:)], 2); end
不推荐的实现方式(动态变量名)
如果确实需要生成带数字后缀的变量,可以用eval实现,但该方法调试难度高、运行效率低,非必要不使用:
total_file = 50; for k = 1:total_file eval(['data_', num2str(k), ' = readtable(file_list{k});']); eval(['Temp_', num2str(k), ' = mean([data_', num2str(k), '.tempx(:), data_', num2str(k), '.tempz(:)], 2);']); eval(['p_', num2str(k), ' = mean([data_', num2str(k), '.px(:), data_', num2str(k), '.pz(:)], 2);']); end
内容的提问来源于stack exchange,提问作者JuliAugust
相关产品推荐
相关产品推荐

