如何保存随时间增长的矩阵?求无需更新表头的Octave/MATLAB文本格式
解决方案
以下两种纯文本格式完全兼容Octave/MATLAB,追加时间步数据时无需修改已有内容:
方案1:展平式CSV(推荐)
将每个时间步的3×4二维切片展平为长度12的行向量,每行对应一个时间步,无固定表头,追加数据直接在末尾加行即可。
存储示例
1,5,9,2,6,10,3,7,11,4,8,12 13,17,21,14,18,22,15,19,23,16,20,24
读写代码
追加新时间步:
% new_slice为当前新增的3×4时间切片 dlmwrite('time_series.csv', new_slice(:)', '-append', 'delimiter', ',');
读取全量3D矩阵:
raw_data = dlmread('time_series.csv'); time_steps = size(raw_data, 1); A = reshape(raw_data', 3, 4, time_steps);
方案2:分块式Octave原生文本格式
每个时间步存储为独立的2D矩阵变量,命名采用A_t+序号的规则,追加数据直接在文件末尾拼接新的变量块即可,无需修改之前的内容。
存储示例
# Created by Octave 6.3.0, Wed Sep 01 10:30:13 2021 BST <pietrom@UNKNOWN> # name: A_t1 # type: matrix # rows: 3 # columns: 4 1 2 3 4 5 6 7 8 9 10 11 12 # name: A_t2 # type: matrix # rows: 3 # columns: 4 13 14 15 16 17 18 19 20 21 22 23 24
读写代码
追加新时间步:
% new_slice为当前新增的3×4时间切片,t为当前时间步序号,写入前将new_slice重命名为A_t{序号}即可 save('-append', 'time_series.txt', 'new_slice', '-ascii', '-mat');
读取全量3D矩阵:
load('time_series.txt'); var_list = who('A_t*'); time_steps = length(var_list); A = zeros(3,4,time_steps); for i = 1:time_steps A(:,:,i) = eval(var_list{i}); end
方案对比
- CSV格式更简洁、跨语言兼容性强、读写效率高,适合绝大多数场景
- 分块原生格式无需手动处理维度重塑逻辑,可保留每个时间步的元信息,适合需要保留变量属性的场景
内容的提问来源于stack exchange,提问作者Pietro
相关产品推荐
相关产品推荐

