题目
编写程序,演示科学计算原生二进制 `.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