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

猜你喜欢

转载自blog.csdn.net/weixin_45891612/article/details/131518050