Octave循环迭代中如何存储每次循环的epochs与metrics矩阵?
Octave中保存每次循环的epochs和metrics数据
问题分析
你的代码中epochs和metrics都是二维矩阵,每次循环会直接覆盖之前的内容,因此最终只保留了第20次循环的结果。要保存20次迭代的全部数据,需要通过扩展数据维度来存储每次迭代的独立结果,推荐两种实现方式:
方案1:三维数组存储(推荐,结构规整)
利用三维数组的第三维区分不同迭代次数的数据,预分配内存时直接指定第三维长度为20:
# 预分配三维数组:行(15000) × 列(19) × 迭代次数(20) epochs = zeros(15000, 19, 20); # 预分配指标三维数组:指标数(3) × 列(19) × 迭代次数(20) metrics = zeros(3, 19, 20); for i = 1:20 start_idx = (i - 1) * epoch_length + 1; end_idx = start_idx + epoch_length - 1; # 将第i次迭代的完整19列数据存入三维数组的第i层 epochs(:,:,i) = patient1(start_idx:end_idx, :); # 计算当前迭代的均值、标准差、方差 meanValue = mean(epochs(:,:,i), 1); stdValue = std(epochs(:,:,i), 0, 1); varValue = var(epochs(:,:,i), 0, 1); # 存储当前迭代的指标到三维数组对应层 metrics(1,:,i) = meanValue; metrics(2,:,i) = stdValue; metrics(3,:,i) = varValue; end
访问方式:
- 取第5次迭代的epochs数据:
epochs(:,:,5) - 取第5次迭代的均值数据:
metrics(1,:,5)
方案2:单元格数组存储(灵活,适配可变维度数据)
如果后续迭代的数据维度可能变化,用单元格数组更灵活,每个单元格存储一次迭代的完整数据:
# 预分配20个元素的单元格数组,每个元素存一次迭代的epochs epochs = cell(20, 1); # 预分配20个元素的单元格数组,每个元素存一次迭代的metrics metrics = cell(20, 1); for i = 1:20 start_idx = (i - 1) * epoch_length + 1; end_idx = start_idx + epoch_length - 1; # 存储第i次迭代的epochs数据 epochs{i} = patient1(start_idx:end_idx, :); # 计算当前迭代的指标 meanValue = mean(epochs{i}, 1); stdValue = std(epochs{i}, 0, 1); varValue = var(epochs{i}, 0, 1); # 将指标组合成矩阵存入单元格 metrics{i} = [meanValue; stdValue; varValue]; end
访问方式:
- 取第5次迭代的epochs数据:
epochs{5} - 取第5次迭代的metrics数据:
metrics{5}
注意事项
原代码存在一个潜在错误:初始epochs是15000行19列,但循环次数是20次,当i>19时epochs(:,i)会超出列数导致索引错误,上述两种方案均已修复该问题。
内容的提问来源于stack exchange,提问作者kostasmath23
相关产品推荐
相关产品推荐

