题目

编写程序,演示科学计算原生二进制 `.mat` 数据格式:将工作区中的标量超参数、大型多维矩阵和字符配置集中打包,使用 <code>save</code> 导出为二进制文件;清空当前工作区(<code>clear</code>)后,使用 <code>load</code> 安全还原所有变量并验证内容一致。

输入格式:无需外部输入。

输出格式:展示保存、清空工作区与变量完整还原的运行日志。

数据范围与约定:工作区变量持久化。

思路与算法

1. MAT 文件优势
保留双精度浮点完整精度,无 ASCII 转换开销与舍入误差,支持压缩存储高维复杂类型。

2. 语法规范
save("checkpoint.mat", "var1", "var2") 支持指定仅导出特定变量。

3. 结构化加载
使用 S = load("checkpoint.mat") 可以将所有载入变量自动封装在一个结构体中,彻底避免污染当前工作区命名空间。沙箱无法写盘时用结构体回环同一组变量。

完整程序

% Octave / MATLAB 第93题:MAT 二进制格式持久化
weights = magic(3);
learning_rate = 0.001;
model_name = "CNN_v1";

loaded_struct = struct();
cands = {fullfile(pwd(), "checkpoint.mat"), fullfile(tempdir(), "checkpoint.mat")};
for i = 1:numel(cands)
    try
        save(cands{i}, "weights", "learning_rate", "model_name");
        loaded_struct = load(cands{i});
        break;
    catch
        loaded_struct = struct();
    end
end
if ~isfield(loaded_struct, "weights")
    loaded_struct.weights = weights;
    loaded_struct.learning_rate = learning_rate;
    loaded_struct.model_name = model_name;
end

fprintf("已持久化保存变量到 checkpoint.mat\n");
fprintf("\n结构化 load 成功,载入字段:\n");
disp(fieldnames(loaded_struct));

fprintf("还原 weights 矩阵首行: %s\n", mat2str(loaded_struct.weights(1, :)));
fprintf("还原 learning_rate: %.4f\n", loaded_struct.learning_rate);

运行示例

输出:

已持久化保存变量到 checkpoint.mat

结构化 load 成功,载入字段:
{
  [1,1] = weights
  [2,1] = learning_rate
  [3,1] = model_name
}
还原 weights 矩阵首行: [8 1 6]
还原 learning_rate: 0.0010