一、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.lib
和 libmx.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"
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 类型的对象,并将读取的数据赋给该对象。
matGetDir
、matGetVariable
函数通过 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 |