MATLAB 之 MAT 文件

一、MAT 文件

  • MAT 文件是 MATLAB 数据存储的默认文件格式,以双精度二进制格式保存数据。
  • MAT 文件为其他程序设计语言(如 C、C++、FORTRAN 等)使用 MATLAB 数据提供了一种共享机制。

1. MAT 文件

  • MAT 文件由 128 字节的 MAT 文件头和尾随其后的数据单元组成。
  • 文件头包括 MATLAB 版本、文件被创建的时间等信息。
  • 数据单元分为标志和数据两个部分,标志占 8 字节,包含数据类型、数据大小等信息。如果标志中的数据字节数小于 4,那么,MATLAB 使用压缩格式存储单元中的数据。
  • MATLAB 的 save 命令可以将 MATLAB 系统内部数据保存为 MAT 文件,而 load 命令可以将磁盘上的 MAT 文件中的数据读入到 MATLAB 系统中。
  • 此外,为了有效地管理 MAT 文件,以及在 MATLAB 外部读取和创建 MAT 文件,MATLAB 提供了一一个子程序库,用户可以在 C、C++、FORTRAN 程序中直接调用这些子程序来创建和读取 MAT 文件。
  • MATLAB 提供的用于操作 MAT 文件的 API 函数封装于两个标准库文件中:libmat.liblibmx.lib。前者用于对 MAT 文件的操作,后者用于对 MAT 文件中矩阵的操作。

2. C 语言 MAT 函数

  • C 语言 MAT 函数用于在 C 程序中对 MAT 文件进行操作。C 语言 MAT 函数及功能详细如下表所示。
MAT 函数函数功能
matOpen打开 MAT 文件
matClose关闭 MAT 文件
matGetDir获取 MAT 文件中的矩阵列表
matGetV ariable从 MAT 文件中读取一个矩阵
matPutV ariable向 MAT 文件写入一个矩阵
matGetNextV ariable从 MAT 文件中读取下一个矩阵
matDeleteV ariable从 MAT 文件中删除-个矩阵
matPutVariableAsGlobal向 MAT 文件写入一个矩阵,当后续从文件读取该矩阵时,放入全局工作区
matGetV ariableInfo从 MAT 文件中读取数据单元的标志信息
matGetNextV ariableInfo从 MAT 文件中读取下一个数据单元的标志信息

3. MAT 文件的基本操作

  • 下面,我们以 C 语言为例,说明 MAT文件的操作办法。
  • 在 C 程序中,通过指向 MAT 文件的指针对文件进行操作,定义指向 MAT 文件的指针的格式如下:
MATFile *mfp;
  • MAT 文件操作函数是在头文件 mat.h 中定义的,因此,C 程序开始部分要使用如下命令:
#include "mat.h"
  • MAT 文件操作分成以下 3 种。

3.1 打开 MAT 文件

  • 打开文件使用 matOpen 函数,其调用格式如下:
mfp=matopen(filename,mode)
  • 其中,mfp 是已经声明为 MAT 文件类型的指针,filename 为要操作的 MAT 文件,mode 用来说明对文件的使用方式,可取以下值。
  • (1) r:以只读方式打开文件。
  • (2) u:以可读也可写方式打开文件。
  • (3) w:以只能写的方式打开文件。如果该文件中有内容,则删除原有内容。
  • (4) wz:打开文件用于写入压缩数据。
  • 如果函数打开成功,则返回函数句柄,否则返回 NULL。

3.2 读写 MAT 文件

  • (1) 向 MAT 文件中写入一个矩阵。函数调用格式如下:
matPutVariable(mfp,name, mp)
matPutArrayAsGlobal(mfp,mp)
  • 其中,mfp 是已经定义的 MAT 文件指针,name 是写入文件的 mxArray 类型的数据在文件中的命名,mp 是指向工作区 mxArray 类型变量的指针。
  • 如果文件中存在与 name 同名的 mxArray ,那么将覆盖原来的值。
  • 如果不存在同名的 mxArray,则将此 mxArray 添加到文件末尾。
  • 函数执行成功,返回 0,否则返回一个非零值。第二个函数调用后,使得用 load 命令装入这个 MAT 文件时,该矩阵对应的变量成为全局变量。
  • (2) 获取 MAT 文件中的变量列表。函数调用格式如下:
matGetDir(mfp,num)
  • 其中,mfp 是已经定义的 MAT 文件指针,num 是指向记录文件中 mxArray 个数的系统变量的指针。
  • 函数执行成功,mfp 返回一个字符指针数组,其中的每个元素指向 MAT 文件中的一个矩阵。
  • 执行失败,mfp 返回一个空指针,num 为 -1。如果 num=0,则表示 MAT 文件中没有矩阵。
  • (3) 从 MAT 文件中读取一个矩阵。函数调用格式如下:
matGetVariable(mfp,name)
  • 其中,mfp 是已经定义的 MAT 文件指针。如果函数执行成功,在内存中创建-一个命名为 name 的 mxArray 类型的对象,并将读取的数据赋给该对象。
  • matGetDirmatGetVariable 函数通过 mxCalloc 函数分配内存,在程序结束时,必须使用 mxFree 函数释放内存。
  • (4) 从 MAT 文件中删除一个矩阵。函数调用格式如下:
matDeleteVariable(mfp,name)
  • 其中,mfp 是已经定义的 MAT 文件指针,name 为要删除的矩阵。如果函数执行成功,将返回 0,否则返回一个非零值。

3.3 关闭 MAT 文件

  • 关闭 MAT 文件使用 matClose 函数,其调用格式如下:
matClose(mfp)
  • 其中,mfp 是已经定义的 MAT 文件指针。
  • 如果函数执行成功,返回 0,否则返回 EOF。

3.4 mx 函数

  • 在 C 程序中,使用 MATLAB 数据时还用到 MATLAB 提供的接口函数中的 mx 函数,以完成对 mxArray 对象的操作。
  • MATLAB 的矩阵运算是以 mxArray 结构体(C++ 中是 mwArray 类)为核心构建的,mxArray 结构体的定义在 MATLAB 的 extern\include\matrix.h 文件中。下表所示为常用 C 语言 mx 函数及功能,其他 mx 函数的用法参见 MATLAB 帮助文件。
C 语言 mx 函数功能
char *mxArrayToString(const mxArray *array_ ptr);将 mxArray 结构体转变为字符串
mxArray *mxCreateDoubleMatrix(int m,int n,mxComplexity ComplexFlag);创建二维双精度类型 mxArray 矩阵
mxArray *mxCreateString(const char *str)创建字符串
void mxDestroyArray(mxArray *array_ ptr);释放由 mxCreate 类函数分配的内存
int mxGetM(const mxArray *array_ ptr);获取矩阵的行数
int mxGetN(const mxArray *array_ ptr);获取矩阵的列数
void mxSetM(mxArray *array_ ptr,int m);设置矩阵的行数
void mxSetN(mxArray *array_ ptr,int m);设置矩阵的列数
double *mxGetPr(const mxArray *array_ ptr);获取矩阵实数部分的数据指针
double *mxGetPi(const mxArray *array_ ptr);获取矩阵虚数部分的数据指针
void mxSetPr(mxArray *array_ ptr,double *pr);设置矩阵实数部分的数据指针
void mxSetPi(mxArray *array_ ptr,double *pr);设置矩阵虚数部分的数据指针
void *mxCalloc(size_ t n,size_ t size);在内存中分配 n 个大小为 size 字节的单元,并初始化为 0