本页对应的英文页面已更新,但尚未翻译。 若要查看最新内容,请点击此处访问英文页面。

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;

Copyright 2012 The MathWorks, Inc.

创建包含一个数组的 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 文件中的稀疏数组,MAT 文件对象:

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

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

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

    • 表变量

    • 元胞数组的元胞

    • 字符串数组

    • 结构体数组字段

    • 用户定义的类

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

提示

  • 有效的部分加载和保存要求 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')

在 R2006a 之前推出