在 MAT 文件中保存和加载部分变量

目录

使用 matfile 函数保存和加载

动态加载部分变量

避免意外加载整个变量

部分加载和保存功能要求 7.3 版本的 MAT 文件


        可以在 MAT 文件中直接保存和加载部分变量,而无需使用 matfile 函数将其加载到内存中。相对于 load 或 save 函数,使用 matfile 函数的主要优点是对于太大而无法装入内存中的数据集,可以仅处理该数据集的一部分。当处理这些大型变量时,应一次将尽可能多的数据读取和写入到内存中。否则,重复的文件访问会严重降低代码的性能。

使用 matfile 函数保存和加载

        此示例说明如何使用 matfile 函数在现有 MAT 文件中加载、修改和保存变量的一部分。

        创建具有两个变量 A 和 B 的 7.3 版 MAT 文件。

A = rand(5);
B = magic(10);
save example.mat A B -v7.3;
clear A B

        基于 MAT 文件 example.mat 构造一个 MatFile 对象。matfile 函数创建一个对应于 MAT 文件的 MatFile 对象,并包含 MatFile 对象的属性。默认情况下,matfile 仅允许从现有 MAT 文件加载。

exampleObject = matfile('example.mat');

        要启用保存,请使用 Writable 参数调用 matfile。

exampleObject = matfile('example.mat','Writable',true);

        或者,构造该对象并在单独的步骤中设置 Properties.Writable。

exampleObject = matfile('example.mat');
exampleObject.Properties.Writable = true;

        将 B 的第一行从 example.mat 加载到变量 firstRowB 中,并修改数据。当索引与 7.3 版的 MAT 文件关联的对象时,MATLAB® 仅加载所指定的变量部分。

firstRowB = exampleObject.B(1,:); 
firstRowB = 2 * firstRowB;

        使用存储在 firstRowB 中的值更新 example.mat 中变量 B 的第一行中的值。

exampleObject.B(1,:) = firstRowB;

        对于非常大的文件,最佳做法是应一次将尽可能多的数据读取和写入到内存中。否则,重复的文件访问会严重影响代码的性能。例如,假设文件包含许多行和列,并且加载一行就需要占用大部分可用内存。这种情况下不要一次更新一个元素,而应该更新一行。

[nrowsB,ncolsB] = size(exampleObject,'B');
for row = 1:nrowsB
  exampleObject.B(row,:) = row * exampleObject.B(row,:);
end

        如果内存大小不是问题,则可以一次更新一个变量的完整内容。

exampleObject.B = 10 * exampleObject.B;

        或者,通过使用 -append 选项调用 save 函数来更新变量。-append 选项要求 save 函数仅替换指定的变量 B,并保留文件中的其他变量不变。此方法始终要求您加载并保存整个变量。

load('example.mat','B');
B(1,:) = 2 * B(1,:);
save('example.mat','-append','B');

        使用 matlab.io.MatFile 对象向文件中添加变量。

exampleObject.C = magic(8);

        还可以通过使用 -append 选项调用 save 函数来添加变量。

C = magic(8);
save('example.mat','-append','C');
clear C

动态加载部分变量

        此示例说明如何动态地从 MAT 文件访问部分变量。在处理变量名称并不始终已知的 MAT 文件时,此功能很有用。

        假设 MAT 文件示例 topography.mat 包含一个或多个具有未知名称的数组。构造一个 MatFile 对象,该对象对应于文件 topography.mat。调用 who 以获取文件中的变量名称。

exampleObject = matfile('topography.mat');
varlist = who(exampleObject)
varlist = 4x1 cell
    {'topo'      }
    {'topolegend'}
    {'topomap1'  }
    {'topomap2'  }

        varlist 是一个元胞数组,包含 topography.mat 中的四个变量的名称。

        第三个和第四个变量(即 topomap1 和 topomap2)都是包含颜色图数据的数组。将每个变量的第三列中的颜色图数据加载到结构体数组 S 的一个字段中。对于每个字段,指定一个由原始变量名称加前缀 colormap_ 构成的字段名称。然后,访问每个变量中作为 exampleObject 的属性的数据。由于 varName 为变量,因此将其括在圆括号中。

for index = 3:4
    varName = varlist{index};
    S(1).(['colormap_',varName]) = exampleObject.(varName)(:,3);
end

        查看结构体数组 S 的内容。

S
S = struct with fields:
    colormap_topomap1: [64x1 double]
    colormap_topomap2: [128x1 double]

        S 具有两个字段,即 colormap_topomap1 和 colormap_topomap2,每个字段包含一个列向量。

避免意外加载整个变量

        如果不知道 MAT 文件中一个大型变量的大小,并且想要一次仅加载该变量的一部分,请不要使用 end 关键字。使用 end 关键字会将相关变量的全部内容临时加载到内存中。对于非常大的变量,加载过程可能会花费较长时间,也可能会产生 Out of Memory 错误。在这种情况下,应对 MatFile 对象调用 size 方法。

        例如,以下代码会将 B 的完整内容临时加载到内存中:

lastColB = exampleObject.B(:,end);

        改用以下代码可提高其性能:

[nrows,ncols] = size(exampleObject,'B');
lastColB = exampleObject.B(:,ncols);

        类似地,任何时候使用 matObj.varName 形式的语法引用变量,例如 exampleObject.B,MATLAB® 都会临时将整个变量加载到内存中。因此,请确保使用以下语法对 MatFile 对象调用 size 方法:

[nrows,ncols] = size(exampleObject,'B');

        而不是将 exampleObject.B 的完整内容传递到 size 函数,

[nrows,ncols] = size(exampleObject.B);

        语法的差异是细微的,但却是重要的。

部分加载和保存功能要求 7.3 版本的 MAT 文件

        如果使用的是与 7 版本或更低版本的 MAT 文件关联的 MatFile 对象,任何加载或保存操作都会临时将整个变量加载到内存中。

        使用 matfile 函数创建 7.3 版本格式的文件。例如,下面的代码

newfile = matfile('newfile.mat');

        创建支持部分加载和保存的 MAT 文件。

​        但是,默认情况下,save 函数创建 7 版本的 MAT 文件。通过使用 -v7.3 选项调用 save 函数,将现有的 MAT 文件转换为 7.3 版本,例如:

load('durer.mat');
save('mycopy_durer.mat','-v7.3');

        要更改预设以将新文件保存为 7.3 版本格式,请访问主页选项卡上的环境部分,然后点击  预设。选择 MATLAB > 常规 > MAT 文件。MATLAB Online™ 中未提供此预设。

  • 16
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值