Main Content

matfile

访问和更改 MAT 文件中的变量,而不必将文件加载到内存中

说明

使用 MAT 文件对象来访问和更改 MAT 文件中的变量,而不必将文件加载到内存中。您可以加载或保存部分变量。与 loadsave 命令相比,使用 MAT 文件对象部分加载和保存变量所需的内存较少。

创建对象

描述

示例

matObj = matfile(filename) 创建 matlab.io.MatFile 对象,该对象连接到 filename 指定的 MAT 文件。

该 MAT 文件对象允许您直接访问和更改 MAT 文件中的变量,而不必将变量加载到内存中。

示例

matObj = matfile(filename,'Writable',isWritable) 启用或禁用对文件的写访问权限。将 isWritable 指定为 truefalse

输入参量

全部展开

MAT 文件的名称,指定为字符向量或字符串标量。

  • filename 可以包含完整路径或部分路径,否则 matfile 会在 MATLAB® 搜索路径中搜索文件。

  • 如果 filename 不包含扩展名,则 matfile 将追加 .mat

  • 如果文件不存在,matfile 将会在首次对变量赋值时创建一个 7.3 版本的 MAT 文件。

启用写访问权限,指定为 truefalse。对于新建文件,默认值为 true;对于现有文件,默认值为 false

  • true - 启用 MAT 文件对象对 MAT 文件的写访问权限。如果文件是只读的,请使用 fileattrib 函数更改系统权限。

  • false - 禁用 MAT 文件对象对 MAT 文件的写访问权限。

属性

全部展开

访问 MAT 文件对象属性

使用语法 ObjectName.Properties.PropertyName 访问 MAT 文件对象属性,其中 PropertyName 是属性的名称。例如,可以使用语法 mObj.Properties.Source 访问连接到 MAT 文件对象 mObj 的 MAT 文件的源文件路径。

文件路径,以字符向量形式返回,其中包含 MAT 文件的完全限定路径。

MAT 文件对象的写访问权限状态,以 truefalse 形式返回。

  • true - MAT 文件对象对 MAT 文件具有写访问权限。

  • false - MAT 文件对象对 MAT 文件具有只读访问权限。

对象函数

size

获取 MAT 文件中变量的数组维度

allDims = size(matObj,variable) 返回对应于 matObj 的文件中指定变量的每个维度的大小。输出 allDims1×m 向量,其中 m = ndims(variable)

[dim1,...,dimN] = size(matObj,variable) 返回单独输出变量 dim1,...,dimN 中每个维度的大小。

selectedDim = size(matObj,variable,dim) 返回指定维度的大小。

注意:不要使用语法 size(matObj.variable) 调用 size。该语法将变量的全部内容加载到内存中。对于非常大的变量,此加载操作将引发 Out of Memory 错误。

who

获取 MAT 文件中变量的列表

varlist = who(matObj) 按字母顺序列出与 matObj 关联的 MAT 文件中的所有变量。可选择在元胞数组 varlist 中返回该列表。

varlist = who(matObj,variables) 列出指定的变量。

whos

获取 MAT 文件中变量的列表,包含其大小和类型信息

details = whos(matObj) 返回与 matObj 关联的 MAT 文件中所有变量的相关信息。

details = whos(matObj,VarName1,...,VarNameN) 返回有关指定变量的信息。

示例

全部折叠

为您的文件创建 MAT 文件对象。matfile 函数构造一个与 MAT 文件对应的 matlab.io.MatFile 对象。

matObj = matfile('myFile.mat')

创建对象时,启用对 MAT 文件 myFile.mat 的写访问权限。

m = matfile('myFile.mat','Writable',true);

您也可以在创建 MAT 文件对象后通过设置 Writable 属性启用写访问权限。

m.Properties.Writable = true;

打开示例 MAT 文件 topography.mat。使用 MAT 文件对象从文件中读取变量 topo。MATLAB® 将整个变量 topo 加载到工作区中。

m = matfile('topography.mat');
topo = m.topo;

创建包含一个数组的 MAT 文件,然后使用 MAT 文件对象向该文件中添加另一个数组。

通过生成 20×20 数组 x 并将其保存到 myFile.mat 来创建一个 MAT 文件。

x = magic(20);
save('myFile.mat','x');

创建 MAT 文件对象,该对象连接到现有的 MAT 文件。通过将 Writable 设置为 true 启用写访问权限。

m = matfile('myFile.mat','Writable',true);

再生成一个 15×15 数组 y。使用 MAT 文件对象将 y 保存到 MAT 文件。使用圆点表示法(与访问结构体数组的字段类似)指定 MAT 文件中的变量。MATLAB® 向该文件添加名为 y 的变量。

y = magic(15);
m.y = y;

显示 MAT 文件 myFile.mat 中存储的所有变量。

whos('-file','myFile.mat')
  Name       Size            Bytes  Class     Attributes

  x         20x20             3200  double              
  y         15x15             1800  double              

使用 MAT 文件对象访问 MAT 文件中变量的特定部分。例如,您可以将数据保存到 MAT 文件中变量的子集,或将变量的子集读入 MATLAB® 工作区中。

使用 MAT 文件对象将数据保存到文件 myFile2.mat 中的变量 y 的子集。首先,创建 MAT 文件对象 m

m = matfile('myFile2.mat');

下一步,创建一个数组并将其保存到变量 y 的一部分。使用圆点表示法(与访问结构体数组的字段类似)指定 MAT 文件中的变量。MATLAB® 将 20×20 数组插入由索引 (81:100,81:100) 指定的 y 的元素中。

m.y(81:100,81:100) = magic(20);

将数组 y 的子集读取到新的工作区变量 z 中。MATLAB® 将 MAT 文件中由索引 (85:94,85:94) 指定的 10×10 子数组读取到工作区变量 z 中。

z = m.y(85:94,85:94);

确定变量的大小,然后计算各列的均值。

打开示例 MAT 文件 stocks.mat

filename = 'stocks.mat';
m = matfile(filename);

确定 stocks.mat 中变量 stocks 的大小。

[nrows,ncols] = size(m,'stocks');

计算变量 stocks 中各列的均值。

avgs = zeros(1,ncols);
for i = 1:ncols
    avgs(i) = mean(m.stocks(:,i));
end

更改 MAT 文件中变量的大小。

创建一个变量,并将其保存到 MAT 文件。

x = magic(20);
save myFile.mat x
whos -file myFile.mat
  Name       Size            Bytes  Class     Attributes

  x         20x20             3200  double              

打开 MAT 文件并调整变量的大小。

m = matfile("myFile.mat",Writable=true);
m.x = magic(30);
whos -file myFile.mat
  Name       Size            Bytes  Class     Attributes

  x         30x30             7200  double              

再次调整变量的大小,这次使它小于初始大小。

m.x = magic(10);
whos -file myFile.mat
  Name       Size            Bytes  Class     Attributes

  x         10x10              800  double              

局限性

  • 通过索引访问 MAT 文件中的部分变量时:

    • 不支持线性索引。您必须指定所有维度的索引。

    • 不支持将复数值赋给实数数组的索引部分。

  • 对于 MAT 文件中的稀疏数组,MAT 文件对象:

    • 支持通过索引读取稀疏数组的子集。

    • 不支持通过索引对稀疏数组的子集写入(赋值)。

  • MAT 文件对象不支持对以下项目进行索引:

    • 表变量

    • 元胞数组的元胞

    • 字符串数组

    • datetime 数组

    • duration 数组

    • 结构体数组字段

    • 用户定义的类

  • MAT 文件对象不支持使用 m 输出计算函数句柄。例如,如果 MAT 文件包含函数句柄 myfunc,则语法 m.myfunc() 将会尝试对该函数句柄进行索引,并且不会调用函数。

  • 在保存句柄对象时,MATLAB 保存对象的副本,而不是句柄的副本。因此,通过在保存对象的工作区中的对象句柄修改对象不会修改保存的句柄对象。

提示

  • 有效的部分加载和保存要求 7.3 版本 MAT 文件。要创建 7.3 版本 MAT 文件,请使用 '-v7.3' 选项调用 save 函数。例如,要将现有的名为 durer.mat 的 MAT 文件转换为 7.3 版本,请调用:

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

  • 如果在索引中使用 end 关键字,则 MATLAB 会将整个变量都加载到内存中。对于非常大的变量,此加载操作将引发 Out of Memory 错误。请不要使用 end,而是使用 size 方法来确定变量的范围:

    sizeMyVar = size(matObj,'myVar')

版本历史记录

在 R2011b 中推出